2011-08-17 17 views
5

Bu kodu vardır:Son 10 DataPoints, her saniye güncellenen bir grafikte nasıl görüntülenir?

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(); 
    } 

kodumu bu bölümü ben bir grafik çizmek zamanlayıcı kene olaydır ve ben noktaları sayımı (MAX_POINTS ulaştığında her tick.I noktaları ekleyebilir ve bunu güncellemeniz gerekir 10) İlk noktayı kaldırır ve sonunda yeni bir tane ekler.

Sorun, MAX_POINTS'a ulaştığında en sonunda noktaları kaldırmaya başlar ve grafik otomatik olarak gezinmez. Tüm noktalar silinir ve yeni noktalar eklenmez.

Lütfen bana yardım edin ve dediğim gibi çalışmam için grafiğimi değiştirmek istediğimi söyle.

DÜZEN 1: Windows Forms kullanıyorum.

DÜZENLEME 2: AddXY ve RemoveAt, puan koleksiyonundan değiller.

DÜZENLEME 3: Ayrıca bir "kapsam" a sahip olmak ve son saat ya da son hafta ya da son ay için verileri görmek istiyorum.

DÜZENLEME 4: Biraz, şimdi son saate noktaları göstermek için grafiği ölçeklemek istiyorum soruma/gün

+0

Bu, WinForms veya WPF kullanıyor mu? WPF'de DataBinding'i bir ObservableCollection 'a kullanabilir ve daha sonra UI'yi (sadece koleksiyon) güncellemek için endişelenmenize gerek yoktur. –

+0

Koleksiyon/Liste sınıfının kendi uygulamanıza sahip olup olmadığını merak ediyorum. Ya da AddXY() ile birlikte kendi uygulamanızdır? – sll

+0

@sllev onlar puan koleksiyonundan ve varsayılan grafik serisi adn puan sınıfları için hiçbir şey değiştirmedim. – Bosak

cevap

8

Mağaza ayrı sözlükte noktaları yanı sıra grafik değişti. Daha sonra en son noktaları istediğinizde sözlüğü sorgulayabilirsiniz.

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

ve Grafikte ile senkronize sözlüğü tutmak istiyorsanız, hem de sözlükten ilk öğesini kaldırmak:

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

sonra AddXY() doğrudan çağrısından sonra bu satırı ekleyin

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

sözlüğü sorgulamak için linq kullanabilirsiniz: Take() DocumentationSkip() Documentation

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

veya belirli bir nokta alabilirsiniz

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

(eğer bir dakika önce gelen noktayı istiyorum diyelim) ya da yapabilirsiniz öğeler üzerinde döngü:

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

Nasıl sözlüğü sorgulamak için? Exampel please.But bu sadece cevaplar sözlüğü sorgulamak için nasıl bir kaç örnek vardır – Bosak

+0

vb son saat/gün/ay dan noktalarını görmek için nasıl. İsterseniz linq ile sorgularınızla daha fazlasını yapabilirsiniz. –

+0

Ben LINQ öğrenmedim. Yani bu puanlar. (10), 10 en çok geri dönüş noktasını alacak ve Enumerable'a dönecek mi? – Bosak

5

You Bunu koymak gerekir:

chart1.ResetAutoValues(); 

X ve Y eksen ölçeğini ayarlamak için

İlgili konular