2016-10-15 54 views
0

我試圖創建一種複製和粘貼功能與我的圖形上的數據,我想知道是否有任何方式來獲得圖表上的一個點的x位置被點擊?在圖表上選擇特定值

基本上,這個想法是能夠點擊一部分圖形並拖動來選擇一個區域,然後我將相應地進行處理。

因此,我需要能夠確定用戶點擊圖形上的哪個位置來確定選定區域的第一個點是什麼。

我通過圖表API看,但我似乎無法找到任何對這類問題的有用..

+0

文本塊嘗試更改它的C#代碼塊。 – mybirthname

+0

如果您對答案感到滿意,請考慮考慮[接受](http://stackoverflow.com/help/accepted-answer)它..! - 我發現你從來沒有這樣做過:在答案的選票下面,點擊左上角的(不可見)複選標記,然後單擊它!它變成綠色,並獲得我們雙方的聲譽.. – TaW

回答

1

直接點擊一個DataPoint你可以做一個HitTest。但是對於小點或選擇範圍來說,這將不會很好。

Axes方法中隱藏了必要的功能。

該解決方案使用一個普通橡皮筋矩形選擇抓點:

enter image description here

Point mdown = Point.Empty; 
List<DataPoint> selectedPoints = null; 

private void chart1_MouseDown(object sender, MouseEventArgs e) 
{ 
    mdown = e.Location; 
    selectedPoints = new List<DataPoint>(); 
} 

private void chart1_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (e.Button == System.Windows.Forms.MouseButtons.Left) 
    { 
     chart1.Refresh(); 
     using (Graphics g = chart1.CreateGraphics()) 
      g.DrawRectangle(Pens.Red, GetRectangle(mdown, e.Location)); 
    } 
} 

private void chart1_MouseUp(object sender, MouseEventArgs e) 
{ 
    Axis ax = chart1.ChartAreas[0].AxisX; 
    Axis ay = chart1.ChartAreas[0].AxisY; 
    Rectangle rect = GetRectangle(mdown, e.Location); 

    foreach (DataPoint dp in chart1.Series[0].Points) 
    { 
     int x = (int)ax.ValueToPixelPosition(dp.XValue); 
     int y = (int)ay.ValueToPixelPosition(dp.YValues[0]); 
     if (rect.Contains(new Point(x,y))) selectedPoints.Add(dp); 
    } 

    // optionally color the found datapoints: 
    foreach (DataPoint dp in chart1.Series[0].Points) 
     dp.Color = selectedPoints.Contains(dp) ? Color.Red : Color.Black; 
} 

static public Rectangle GetRectangle(Point p1, Point p2) 
{ 
    return new Rectangle(Math.Min(p1.X, p2.X), Math.Min(p1.Y, p2.Y), 
     Math.Abs(p1.X - p2.X), Math.Abs(p1.Y - p2.Y)); 
} 

請注意,這會爲Line, FastLine and Point圖表工作。對於其他類型,你將不得不適應選擇標準!

+0

謝謝! ValueToPixelPosition函數正是我所需要的。 – user3713569

+0

另一個快速問題。你知道任何簡單的方法來改變點之間的線的顏色,而不是改變點本身的顏色,因爲我使用的是FastLine圖表? – user3713569

+0

FastLine不可能。如果你想要這個和其他額外功能,可以使用'Line',然後你可以設置每個'DataPoint'的'Color' .. - 如果你對一個答案感到滿意,請考慮[接受](http://stackoverflow.com/幫助/接受答案)它..! – TaW