2015-11-24 104 views
0

我想獲得與用戶點擊的ChartArea的X位置對應的系列的Y值。從點擊ChartArea的X Cursor位置獲取Y系列的值從

我試圖捕捉chartarea內的鼠標被點擊時的X位置,但我得到NaN的返回結果:

private void chart_Click(object sender, EventArgs e) 
    { 
     double XVal = chart.ChartAreas[0].CursorX.Position; 
    } 

一次,我已經得到了在chartarea,其中X位置用戶點擊了鼠標,然後我想用它來獲取該x座標系中的Y值。

+0

位置是什麼樣的對象?這可能不是一個數字,如果你得到「NaN」 –

回答

1
  • 你的代碼有什麼問題?

至於chart.ChartAreas[0].CursorX:甲Chart Cursor是通過創建並用於zooming和其隨後

表示一個水平或垂直線,其限定沿 軸線的位置的對象。

因此,它與鼠標光標沒有多大關係,在沒有縮放或(禁用縮放功能時)無法選擇時無效。

  • 如何解決你的問題呢?

有幾個選項,你有;不幸的是,沒有一個是簡單的正是你所要求的。

簡單的事情就是用HitTestCharts

private void chart1_MouseMove(object sender, MouseEventArgs e) 
{ 
    HitTestResult hit = chart1.HitTest(e.X, e.Y); 
    if (hit.PointIndex >= 0) 
     infoLabel.Text = "Over DataPoint No " + hit.PointIndex; 
} 

這是簡單和安全的,但只有當光標實際上是一個DataPoint會工作。它適合你的程度可能取決於ChartType;對於ColumnsBars非常好,但對於PointsBubbles不太好。

你可以調用PixelPositionToValue

private void chart1_MouseMove(object sender, MouseEventArgs e) 
{ 
    var xv = chart1.ChartAreas[0].AxisX.PixelPositionToValue(e.X);      
    var yv = chart1.ChartAreas[0].AxisY.PixelPositionToValue(e.Y); 
    infoLabel.Text = "x = " + xv + " y =" + yv; 
} 

theory這是唯一安全的從Paint事件的一個呼叫,但在實踐中,似乎從用戶交互稱爲以及何時做工精細。 (如果遇到問題,您可以在Paint事件之一上執行dummy call並在提取所需值後用標誌中止該示例;該示例做的比您需要的要多得多,但我懷疑它會是什麼必須在所有..)

但是它只會根據軸,而不是最近的DataPoint帶回Values。如果你真的需要在實際DataPoint,你將不得不做了你的Series ..的Points搜索:

Series S = chart1.Series[0];   // short reference 
DataPoint pPrev = S.Points.Select(x => x) 
         .Where(x => x.XValue >= xv) 
         .DefaultIfEmpty(S.Points.First()).First(); 
DataPoint pNext = S.Points.Select(x => x) 
         .Where(x => x.XValue <= xv) 
         .DefaultIfEmpty(S.Points.Last()).Last(); 

這應該彈出一個和下一個DataPoint。它是由你來決定使用哪一個..

+0

謝謝,但是我應該補充說我使用的是.NET 3.5,而Points似乎沒有Select方法,或First和Last方法。 –

+0

這些是LINQ方法,所以一定要包含命名空間:'using System.Linq;' – TaW

0

首先鼠標點擊位置轉換爲相對位置:

x= 100.0 * e.X/chart.Width 

相對位置。然後轉換成軸位置:

double xMin= axis.Minimum; 
double xMax= axis.Maximum; 
double pMin= axis.GetPosition(xMin); 
double pMax= axis.GetPosition(xMax); 
xx= (x-pMin) * (xMax-xMin)/(pMax-pMin) + xMin; 

然後使用軸位置來探測系列(例如內插或你最喜歡的最近點)

0

你需要一個鼠標點擊處理程序爲您的圖表控件,而不是一個正常的點擊處理程序,因爲「MouseEventArgs」的:

private void chart1_MouseClick(object sender, MouseEventArgs e) 
{ 
    //check where you clicked, returns different information like the clicked series name and the index of the clicked point 
    HitTestResult clicked = chart1.HitTest(e.X, e.Y); 
    //this is how you get your y-Value 
    double yValue = chart1.Series[clicked.Series.Name].Points[clicked.PointIndex].YValues[0]; 
}