Personalización y eventos (Controles Chart)
En el control Chart, puede utilizar eventos para personalizar el comportamiento del gráfico, por ejemplo, realizar un dibujo personalizado. Los controles Chart para ASP.NET y Windows Forms exponen diferentes conjuntos de eventos. Para obtener una lista completa de eventos para cada control, vea System.Web.UI.DataVisualization.Charting.Chart y System.Windows.Forms.DataVisualization.Charting.Chart.
PrePaint y PostPaint
Los eventos que se utilizan con más frecuencia son PrePaint y PostPaint. Se desencadenan antes y después de dibujar cada elemento de gráfico.
Nota
Estos dos eventos no se desencadenan para los objetos Series cuando la capacidad 3D está habilitada para un área del gráfico.
Para averiguar el elemento de gráfico para el que se desencadena el evento actual, utilice la propiedad ChartPaintEventArgs.ChartElement.
El siguiente controlador de eventos dibuja seis círculos concéntricos después de haber dibujado el elemento Series y resalta un punto de datos denominado "Product F".
Private Sub chart1_PostPaint(ByVal sender As Object, ByVal e As ChartPaintEventArgs)
If TypeOf e.ChartElement Is Series Then
Dim series As Series = DirectCast(e.ChartElement, Series)
Dim position As System.Drawing.PointF = System.Drawing.PointF.Empty
' Find data point with label "Product F".
For Each point As DataPoint In series.Points
position.X += 1
If point.AxisLabel = "Product F" Then
position.Y = CSng(point.YValues(0))
Exit For
End If
Next
' Get relative coordinates of the data point values found.
position.X = CSng(e.ChartGraphics.GetPositionFromAxis("Default", AxisName.X, position.X))
position.Y = CSng(e.ChartGraphics.GetPositionFromAxis("Default", AxisName.Y, position.Y))
' Convert relative coordinates to absolute coordinates.
position = e.ChartGraphics.GetAbsolutePoint(position)
' Draw custom object.
For radius As Integer = 20 To 79 Step 10
e.ChartGraphics.Graphics.DrawEllipse(System.Drawing.Pens.Red, position.X - radius / 2, _
position.Y - radius / 2, radius, radius)
Next
End If
End Sub
private void chart1_PostPaint(object sender, ChartPaintEventArgs e)
{
if (e.ChartElement is Series)
{
Series series = (Series)e.ChartElement;
System.Drawing.PointF position = System.Drawing.PointF.Empty;
// Find data point with label "Product F".
foreach (DataPoint point in series.Points)
{
++position.X;
if (point.AxisLabel == "Product F")
{
position.Y = (float)point.YValues[0];
break;
}
}
// Get relative coordinates of the data point values found.
position.X = (float)e.ChartGraphics.GetPositionFromAxis("Default", AxisName.X, position.X);
position.Y = (float)e.ChartGraphics.GetPositionFromAxis("Default", AxisName.Y, position.Y);
// Convert relative coordinates to absolute coordinates.
position = e.ChartGraphics.GetAbsolutePoint(position);
// Draw custom object.
for (int radius = 20; radius < 80; radius += 10)
{
e.ChartGraphics.Graphics.DrawEllipse(System.Drawing.Pens.Red, position.X - radius / 2,
position.Y - radius / 2, radius, radius);
}
}
}