Alla fine ho risolto in un altro modo. In pratica prendo il controllo padre dentro al quale é contenuto il grafico tramite "chart1.Parent". A quel punto aggiungo il label all'interno del controllo padre e lo porto in primo piano (in modo da mettere il label sopra il grafico). A questo punto invece di ridisegnare il grafico, ridisegno il controllo padre, che é molto piú leggero da ridisegnare. In pratica il label non l'ho messo dentro al grafico ma sopra in modo da ridisegnare il controllo padre che é piú leggero.
Qui il codice, magari puó tornare utile a qualcuno:
Control controllo = chart1.Parent;
if (controllo.Controls.Contains(label))
{
controllo.Controls.Remove(label);
}
HitTestResult result2 = chart1.HitTest(e.X, e.Y);
if (result2.ChartElementType == ChartElementType.DataPoint)
{
var serie = result2.Series;
double valore = 0;
dynamic data;
DataPoint dp = serie.Points[result2.PointIndex];
if (serie.XValueType == ChartValueType.DateTime)
{
data = (DateTime.FromOADate(dp.XValue));
}
else
{
data = Math.Round(dp.XValue, 2);
}
if (chartarea.AxisY.IsLogarithmic == true)
{
valore = Math.Round(Math.Pow(10, chartarea.AxisY.PixelPositionToValue(e.Location.Y) ), 2);
}
else
{
valore = Math.Round(chartarea.AxisY.PixelPositionToValue(e. Location.Y), 2);
}
label.Text = "X: " + Convert.ToString(data) + "\n" + "Y: " + Convert.ToString(valore);
var coordinate = new Point(e.X + 20, e.Y + 20);
coordinate = chart1.PointToScreen(coordinate);
coordinate = controllo.PointToClient(coordinate);
label.Location = coordinate;
controllo.Controls.Add(label);
label.BringToFront();
controllo.Invalidate(); //ridisegna il grafico
controllo.Update();
}



Rispondi quotando
