2012-05-18 9 views
11

Tôi có biểu đồ và tôi muốn người dùng xem các giá trị khi con trỏ nằm trên các điểm. Bằng cách sử dụng sự giúp đỡ của digEmAll trong trang finding the value of the points in a chart, tôi có thể viết đoạn mã sau:xem giá trị của các điểm biểu đồ khi chuột ở trên các điểm

Point? prevPosition = null; 
ToolTip tooltip = new ToolTip(); 

void chart1_MouseMove(object sender, MouseEventArgs e) 
{  
    var pos = e.Location;  
    if (prevPosition.HasValue && pos == prevPosition.Value)   
     return;  
    tooltip.RemoveAll();  
    prevPosition = pos;  
    var results = chart1.HitTest(pos.X, pos.Y, false, ChartElementType.PlottingArea);  
    foreach (var result in results)  
    {   
     if (result.ChartElementType == ChartElementType.PlottingArea)   
     {    
      chart1.Series[0].ToolTip = "X=#VALX, Y=#VALY";   
     }  
    } 
} 

bằng đoạn mã trên, người dùng có thể nhìn thấy các giá trị khi con trỏ là gần một series.But nay thế nào có thể Tôi cho phép người dùng xem các giá trị chỉ khi con trỏ là trên các điểm? tôi thay

int k = result.PointIndex; 
if (k >= 0) 
{ 
    chart1.Series[0].Points[k].ToolTip = "X=#VALX, Y=#VALY"; 
} 

thay vì

chart1.Series[0].ToolTip = "X=#VALX, Y=#VALY"; 

để giải quyết tôi problem.But Nó không hữu ích.

Trả lời

18

Bạn nên thay đổi mã theo cách này:

Point? prevPosition = null; 
ToolTip tooltip = new ToolTip(); 

void chart1_MouseMove(object sender, MouseEventArgs e) 
{ 
    var pos = e.Location; 
    if (prevPosition.HasValue && pos == prevPosition.Value) 
     return; 
    tooltip.RemoveAll(); 
    prevPosition = pos; 
    var results = chart1.HitTest(pos.X, pos.Y, false, 
            ChartElementType.DataPoint); 
    foreach (var result in results) 
    { 
     if (result.ChartElementType == ChartElementType.DataPoint) 
     { 
      var prop = result.Object as DataPoint; 
      if (prop != null) 
      { 
       var pointXPixel = result.ChartArea.AxisX.ValueToPixelPosition(prop.XValue); 
       var pointYPixel = result.ChartArea.AxisY.ValueToPixelPosition(prop.YValues[0]); 

       // check if the cursor is really close to the point (2 pixels around the point) 
       if (Math.Abs(pos.X - pointXPixel) < 2 && 
        Math.Abs(pos.Y - pointYPixel) < 2) 
       { 
        tooltip.Show("X=" + prop.XValue + ", Y=" + prop.YValues[0], this.chart1, 
            pos.X, pos.Y - 15); 
       } 
      } 
     } 
    } 
} 

Ý tưởng là để kiểm tra xem chuột là rất gần với các điểm ví dụ 2 pixel xung quanh nó (vì thực sự không thể là chính xác trên điểm) và hiển thị chú giải công cụ trong trường hợp đó.

Here's a complete working example.

+1

Làm việc một cách hoàn hảo cho trục chính. Nhưng điều kiện '(Math.Abs ​​(pos.X - pointXPixel) <2 && Math.Abs ​​(pos.Y - pointYPixel) <2)' không thành công cho chuỗi trục thứ cấp. –

+0

@RameshDurai: đúng, mã này chỉ xem xét trục chính. – digEmAll

7

tôi sẽ có được giải pháp này:

Thêm xử lý sự kiện tùy chỉnh tooltip:

this.chart1.GetToolTipText += this.chart1_GetToolTipText; 

Thực hiện xử lý sự kiện:

private void chart1_GetToolTipText(object sender, ToolTipEventArgs e) 
    { 
    // Check selected chart element and set tooltip text for it 
    switch (e.HitTestResult.ChartElementType) 
    { 
     case ChartElementType.DataPoint: 
      var dataPoint = e.HitTestResult.Series.Points[e.HitTestResult.PointIndex]; 
      e.Text = string.Format("X:\t{0}\nY:\t{1}", dataPoint.XValue, dataPoint.YValues[0]); 
      break; 
    } 
    } 
+0

Tôi đã thử mã của bạn.Nó sẽ kích hoạt khi chuột của tôi di chuột lên biểu đồ nhưng không có chú giải công cụ nào được hiển thị. –

+0

@M_Mogharrabi: Tôi chưa thể kiểm tra, nhưng từ bộ nhớ của tôi: - Bạn phải hiển thị "điểm đánh dấu" - Không đặt thuộc tính ToolTip của điểm dữ liệu, hãy xem https://stackoverflow.com/questions/ 14256283/show-tooltip-only-on-the-datapoint-cho-line-graph-in-mschart – jreichert