2012-05-18 9 views
11

Mam wykres i chcę użytkownika, aby zobaczyć wartości, gdy wskaźnik znajduje się na punkty. Korzystając z pomocy digEmAll w stronę finding the value of the points in a chart, mógłbym napisać następujący kod:zobaczyć wartości punktów wykresu gdy mysz jest na punkty

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";   
     }  
    } 
} 

powyższym kodzie, użytkownik może zobaczyć wartości, gdy wskaźnik jest blisko series.But teraz jaki sposób Pozwoliłem użytkownikowi zobaczyć wartości tylko wtedy, gdy wskaźnik jest na punktach? Wymieniłem

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

zamiast

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

rozwiązać mój problem.But To nie był przydatny.

Odpowiedz

18

należy zmodyfikować kod w następujący sposób:

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

Chodzi o to, aby sprawdzić, czy mysz jest bardzo blisko punktu np 2 pikseli wokół niego (ponieważ tak naprawdę nie będzie to dokładnie na punkcie) i będzie pokazywać etykietkę w takim przypadku.

Here's a complete working example.

+1

doskonale Praca dla osi podstawowej. Ale warunek '(Math.Abs ​​(pos.X - pointXPixel) <2 && Math.Abs ​​(pos.Y - pointYPixel) <2)' nie działa dla serii osi pomocniczych. –

+0

@RameshDurai: tak, prawda, ten kod dotyczy tylko osi głównej. – digEmAll

7

wziąłbym tego rozwiązania:

Dodaj zwyczaj podpowiedzi obsługi zdarzeń:

this.chart1.GetToolTipText += this.chart1_GetToolTipText; 

Wdrożenie obsługi zdarzeń:

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

Próbowałem twojego kodu. Wystrzeliwuje, gdy moja myszka umieszcza kursor na mapie, ale nie pokazała się żadna etykietka. –

+0

@M_Mogharrabi: Nie mogę przetestować go jeszcze, ale z mojej pamięci: - Trzeba pokazać „znaczniki punktu” - nie ustawić właściwość Etykietka punktu danych, patrz https://stackoverflow.com/questions/ 14256283/show-tooltip-only-on-the-datapoint-for-line-graph-in-mschart – jreichert

Powiązane problemy