2012-05-18 13 views
11

Grafiklerim var ve işaretçiler noktalarda olduğunda kullanıcının değerleri görmesini istiyorum. sayfa finding the value of the points in a chart yılında digEmAll yardımına kullanarak, ben aşağıdaki kodu yazabilirsiniz: Yukarıdaki kodlaFare üzerinde bulunan grafik noktalarının değerlerini gör

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

, işaretçi Nasıl artık bir series.But yakın değerlerini görebilirsiniz kullanıcı olduğunda Kullanıcının sadece işaretçiler üzerinde işaretlerini gördüğünde değerleri görmesine izin verdim? Ben benim problem.But Bu yararlı hiç olmadı çözmek için yerine

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

ait

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

yerini aldı.

cevap

18

Bu şekilde her kodunu değiştirmek gerekir:

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); 
       } 
      } 
     } 
    } 
} 
fikri fare noktasına örn çok yakın olup olmadığını kontrol etmektir

Çevresinde 2 piksel (bu noktada tam olarak olması muhtemel değildir) ve bu durumda araç ipucunu gösterir.

Here's a complete working example.

+1

birincil eksen için mükemmel çalışmak. Ama ikincil eksen serileri için '(Math.Abs ​​(pos.X - pointXPixel) <2 && Math.Abs ​​(pos.Y - pointYPixel) <2)' durumu başarısız. –

+0

@RameshDurai: evet, bu kod yalnızca birincil ekseni dikkate alır. – digEmAll

7

Bu çözümü alacaktı:

Özel araç olay işleyicisi ekleyin:

this.chart1.GetToolTipText += this.chart1_GetToolTipText; 

olay işleyicisi uygulamak:

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

Kodunuzu denedim. Faremin grafiğinde gezinirken ancak araç ipucu gösterilmediğinde yangın çıkıyor. –

+0

@M_Mogharrabi: Henüz test edemiyorum, ama bellekten: - "Nokta işaretleyicileri" göstermeniz gerekiyor - Veri noktasının ToolTip özelliğini ayarlamayın, bkz. Https://stackoverflow.com/questions/ 14256283/göstermek-ipucu salt-on-the-veri noktasının-için-line-grafiği-içinde-MSChart – jreichert