Anpassung und Ereignisse (Diagrammsteuerelemente)
Im Diagrammsteuerelement können Sie mithilfe von Ereignissen das Diagrammverhalten anpassen, z. B. indem Sie eine benutzerdefinierte Zeichnung durchführen. Die Diagrammsteuerelemente für ASP.NET und Windows Forms verfügen über andere Ereignissätze. Eine vollständige Liste der Ereignisse für jedes Steuerelement finden Sie unter System.Web.UI.DataVisualization.Charting.Chart und System.Windows.Forms.DataVisualization.Charting.Chart.
PrePaint und PostPaint
Die am häufigsten verwendeten Ereignisse sind PrePaint und PostPaint. Sie werden vor bzw. nach dem Zeichnen jedes Diagrammelements ausgelöst.
Tipp
Diese beiden Ereignisse werden für Series-Objekte nicht ausgelöst, wenn 3D für einen Diagrammbereich aktiviert ist.
Verwenden Sie die ChartPaintEventArgs.ChartElement-Eigenschaft, um das Diagrammelement zu ermitteln, für das das aktuelle Ereignis ausgelöst wurde.
Der folgende Ereignishandler zeichnet sechs konzentrische Kreise, nachdem das Series-Element gezeichnet wurde, und hebt einen Datenpunkt mit dem Namen "Product F" hervor.
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);
}
}
}