2012-05-18 14 views
11

Ho un grafico e voglio che l'utente veda i valori quando il puntatore si trova sui punti. Utilizzando l'aiuto di digEmAll nella pagina finding the value of the points in a chart, potrei scrivere il seguente codice:vedere i valori dei punti del grafico quando il mouse è sui punti

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

dal codice di cui sopra, l'utente può visualizzare i valori quando il puntatore è vicino alla un series.But ora Come può Lascio che l'utente veda i valori solo quando il puntatore è su i punti? Ho sostituito

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

invece di

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

per risolvere il mio problem.but Non è stato utile.

risposta

18

Si dovrebbe modificare il codice in questo modo:

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

L'idea è quella di verificare se il mouse è molto vicino al punto di esempio 2 pixel attorno ad esso (perché è davvero improbabile che sia esattamente sul punto) e mostrare il suggerimento in quel caso.

Here's a complete working example.

+1

perfetto lavoro per l'asse principale. Ma la condizione '(Math.Abs ​​(pos.X - pointXPixel) <2 && Math.Abs ​​(pos.Y - pointYPixel) <2)' fallisce per le serie di assi secondari. –

+0

@RameshDurai: sì corretto, questo codice considera solo l'asse primario. – digEmAll

7

vorrei prendere questa soluzione:

Aggiungi gestore eventi tooltip personalizzato:

this.chart1.GetToolTipText += this.chart1_GetToolTipText; 

Implementare gestore di eventi:

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

Ho provato il tuo codice. Si attiva quando il mio mouse passa il mouse sul grafico ma non è stato mostrato alcun suggerimento. –

+0

@M_Mogharrabi: Non riesco ancora a testarlo, ma dalla mia memoria: - Devi mostrare i "punti" - Non impostare la proprietà ToolTip del punto dati, vedi https://stackoverflow.com/questions/ 14256283/show-tooltip-only-on-the-datapoint-per-linea-graph-in-MSChart – jreichert