2015-08-27 40 views
1

我有一個程序運行在一臺服務器上,該服務器每5秒鐘聯繫一次其數據的在線API。數據以成對的形式保存在數據庫中。一對由一個UNIX-Timestamp和一個double值組成。 在我的C#應用​​程序中,我想同時顯示2個API的值。 X軸包含時間戳,Y軸包含雙精度值。 確保兩個系列具有相同的X值 - 只有Y值不同。它看起來像這樣:C#圖表:關於ChartAreas.Cusor和讀取X/Y值的多個問題

The chart

你可以看到,我已經添加了ChartArea [0] .CursorX的圖表(綠線)。它得到像這樣更新:

private void chart1_MouseMove(object sender, MouseEventArgs e) 
     { 
      Point p = new Point(e.X, e.Y); 

      chart1.ChartAreas[0].CursorX.SetCursorPixelPosition(p, true); 

      DateTime t = DateTime.FromOADate(chart1.ChartAreas[0].AxisX.PixelPositionToValue(e.X)); 
      graph_time.Text = t.ToLongTimeString(); 

     } 

因此,綠色的CursorX被設置爲鼠標的X位置。但是,我將其間隔設置爲5秒

  • 首先問

我試圖與這些線

DateTime t = DateTime.FromOADate(chart1.ChartAreas[0].AxisX.PixelPositionToValue(e.X)); 
graph_time.Text = t.ToLongTimeString(); 

的問題是,以顯示CursorX的x值在標籤,它顯示的X值從真實光標(我隱藏)而不是綠線的位置。我怎樣才能得到綠線X軸的價值?

  • 第二個問題

我也想要顯示的綠/藍和綠/紅色線的交叉點的兩個單獨的標籤值。有沒有人有一個想法如何做到這一點?我閱讀了HitTest,但你需要一個X和Y值。我需要類似Vertical HitTest的東西。

  • 第三和最後一個問題

是否有綁定的綠線(ChartArea.CursorX)實際exisiting數據點,而不是設置一個間隔的可能性?因爲它有兩個問題:1.當圖表的對看起來像這樣(時間戳,值){2,1.23},{7,43.2},{12,5.3}和CursorX間隔設置爲5秒,CursorX停在X = 0,5,10而不是X = 2,7,12。 2.有時,兩對之間的時間差異不是5秒鐘,它有時可能是4或6.間隔5秒會產生錯誤 - 因爲我希望CusorX僅停留在現有的DataPoints上。

所以,就是這樣。我今天第一次嘗試了C#中的圖表,並且有很多很酷的想法涌入我的腦海 - 有很多問題需要實現。希望你們中的一些人擅長C#圖表,並可以幫助我:)

謝謝!

回答

0

讓我試着回答沒有測試..:

1 - 使用CursorX.Position得到的x值光標坐在

2 - 查找之前和之後光標兩個數據點和插值的Y值。您可以使用LINQ找到這兩個點。有關如何在點集合中搜索的示例,請參閱here

3 - 請參閱2!選擇第一個或第二個或最近的點;您需要將Interval設置爲0。

0

昨天晚上我試了一下,我的問題的解決方案實際上比我想象的要容易得多。它非常類似於來自TaW的答案

 private void chart1_MouseMove(object sender, MouseEventArgs e) 
     { 
      if (e.X < 0 || e.Y < 0 || e.Location == prevPos) 
       return; 
      prevPos = e.Location; 
      if (this.graphShowingData == false) 
       return; 

      Point p = new Point(e.X, e.Y); 
      double searchVal = chart1.ChartAreas[0].AxisX.PixelPositionToValue(e.X); 

      foreach (DataPoint dp in chart1.Series["Series1"].Points) 
      { 
       if(dp.XValue >= searchVal) 
       { 
        chart1.ChartAreas[0].CursorX.SetCursorPosition(dp.XValue); 
        foreach(double yD in dp.YValues) 
        { 
         val_series1.Text = Math.Round(yD, 4).ToString(); 
        } 
        break; 
       } 
      } 

      foreach (DataPoint dp in chart1.Series["Series2"].Points) 
      { 
       if (dp.XValue >= searchVal) 
       { 
        foreach (double yD in dp.YValues) 
        { 
         val_series2.Text = Math.Round(yD, 4).ToString(); 
        } 
        break; 
       } 
      } 


      DateTime t = DateTime.FromOADate(chart1.ChartAreas[0].CursorX.Position); 
      graph_time.Text = t.ToLongTimeString(); 

     } 

此代碼解決了我上面提到的所有三個問題。