2011-08-17 20 views
5

tôi có mã này:Làm cách nào để xem 10 Điểm dữ liệu cuối cùng trong biểu đồ cập nhật từng giây?

private void timer_Tick(object sender, EventArgs e) 
    { 
     timer.Stop(); 
     for (int i = 0; i < TOTAL_SENSORS; i++) 
     { 
      DateTime d = DateTime.Now; 
      devices[i].Value = float.Parse(serialPort.ReadLine()); 
      if (chart1.Series[i].Points.Count > MAX_POINTS) 
      { 
       //see the most recent points 
      } 
      chart1.Series[i].Points.AddXY(d, devices[i].Value); 
     } 
     timer.Start(); 
    } 

Phần này của mã của tôi là sự kiện đánh dấu của timer nơi tôi vẽ một biểu đồ và tôi cần phải cập nhật nó mỗi tick.I giữ thêm điểm và khi đếm điểm đạt MAX_POINTS (10) nó loại bỏ các điểm đầu tiên thêm một điểm mới ở cuối.

Vấn đề là khi đạt đến MAX_POINTS, nó bắt đầu xóa điểm ở cuối và biểu đồ không tự động ghi. Tất cả các điểm bị xóa và không có điểm mới nào được thêm vào.

Hãy giúp tôi và nói những gì tôi cần thay đổi biểu đồ để hoạt động như tôi đã nói.

CHỈNH SỬA 1: Tôi đang sử dụng Biểu mẫu Windows.

CHỈNH SỬA 2: AddXY và RemoveAt không phải là của tôi, chúng là từ bộ sưu tập điểm.

CHỈNH SỬA 3: Tôi cũng muốn biết cách có 'phạm vi' và xem dữ liệu cho giờ trước hoặc trong tuần cuối cùng hoặc cho tháng trước.

EDIT 4: Tôi đã thay đổi câu hỏi của tôi một chút, bây giờ tôi muốn mở rộng bảng xếp hạng để hiển thị các điểm từ giờ cuối cùng/ngày

+0

Đây có phải là sử dụng WinForms hoặc WPF không? Trong WPF, bạn có thể sử dụng DataBinding để một ObservableCollection và sau đó bạn không phải lo lắng về việc cập nhật giao diện người dùng (chỉ bộ sưu tập). –

+0

Tôi tự hỏi liệu bạn có thực hiện riêng của lớp Collection/List không? Hoặc RemoveAt đó là triển khai của riêng bạn cùng với AddXY()? – sll

+0

@sllev chúng là từ bộ sưu tập điểm và tôi đã không thay đổi bất kỳ thứ gì thành các lớp adn điểm mặc định của biểu đồ. – Bosak

Trả lời

8

Store điểm trong một cuốn từ điển riêng biệt cũng như bảng xếp hạng. Sau đó, bạn chỉ có thể truy vấn từ điển khi bạn muốn các điểm gần đây nhất.

Dictionary<DateTime, float> points = new Dictionary<DateTime, float>(); 

sau đó thêm dòng này trực tiếp sau khi cuộc gọi của bạn để AddXY():

points.Add(d, devices[i].Value); 

và nếu bạn muốn giữ lại các từ điển đồng bộ với bảng xếp hạng, loại bỏ các yếu tố đầu tiên từ điển cũng như:

points.Remove(points.Keys[0]); 

Để truy vấn từ điển, bạn có thể sử dụng LINQ: Take() DocumentationSkip() Documentation

IEnumerable<KeyValuePair<DateTime, float>> mostRecent = points.Skip(points.Count - 10).Take(10); 

hoặc bạn có thể nhận được một điểm cụ thể (cho phép nói rằng bạn muốn điểm từ một phút trước)

float value = points[DateTime.Now.AddMinutes(-1)]; 

hoặc bạn có thể lặp qua các mục:

foreach(KeyValuePair<DateTime, float> point in points) 
{ 
    DateTime time = point.Key; 
    float value = point.Value; 
} 
+0

Làm thế nào để truy vấn từ điển? Exampel please.But này chỉ trả lời làm thế nào để xem các điểm từ giờ cuối cùng/ngày/tháng, vv – Bosak

+0

Có một vài ví dụ về cách truy vấn từ điển. Bạn có thể làm nhiều hơn nữa với các truy vấn của bạn với LINQ, nếu bạn thích. –

+0

Tôi chưa học được LINQ. Vì vậy, điều này 'points.Take (10);' sẽ nhận được 10 điểm reccent nhất và trả về một Enumerable? – Bosak

5

Bạn cần phải đặt điều này:

chart1.ResetAutoValues(); 

để điều chỉnh tỷ lệ trục X và Y

Các vấn đề liên quan