Dies ist nicht möglich mit GridLines
, da sie immer an dem festen Interval
Abstand gezogen werden. Hier ist ein Beispiel von rund arbeiten, indem sie die Linien in einem xxxPaint
Ereignis Zeichnung ..
Zuerst haben wir eine Liste mit Stoppwerte für die GridLines
erklären wir wollen:
List<double> stops = new List<double>();
Dann bereiten wir das Diagramm:
AddPoints();
ChartArea ca = chart1.ChartAreas[0];
ca.AxisX.Minimum = 0; // optional
ca.AxisX.MajorGrid.Enabled = false;
ca.AxisX.MajorTickMark.Enabled = false;
ca.AxisX.LabelStyle.Enabled = false;
stops.AddRange(new[] { 0, 15, 45, 50.5, 65, 90, 100 });
Bitte beachte, dass ich hinzugefügt haben einen zusätzlichen Wert (50.5
) zu zeigen, wie wir GridLines
selbst ziehen können, wo nicht DataPoints
sind!
Dann kodieren wir das PostPaint
Ereignis:
private void chart1_PostPaint(object sender, ChartPaintEventArgs e)
{
Graphics g = e.ChartGraphics.Graphics;
g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit;
ChartArea ca = chart1.ChartAreas[0];
Font font = ca.AxisX.LabelStyle.Font;
Color col = ca.AxisX.MajorGrid.LineColor;
int padding = 10; // pad the labels from the axis
int y0 = (int)ca.AxisY.ValueToPixelPosition(ca.AxisY.Minimum);
int y1 = (int)ca.AxisY.ValueToPixelPosition(ca.AxisY.Maximum);
foreach (int sx in stops)
{
int x = (int)ca.AxisX.ValueToPixelPosition(sx);
using (Pen pen = new Pen(col))
g.DrawLine(pen, x, y0, x, y1);
string s = sx + "";
if (ca.AxisX.LabelStyle.Format != "")
s = string.Format(ca.AxisX.LabelStyle.Format, s);
SizeF sz = g.MeasureString(s, font, 999);
g.DrawString(s, font, Brushes.Black, (int)(x - sz.Width/2) , y0 + padding);
}
Dies ist das Ergebnis:
Beachten Sie, dass die meisten der Code in der PostPaint
Ereignis nur Vorbereitung ist; die beiden eigentlichen Zeichnung fordert, dass die Linien und die Etiketten sind gewöhnliche GDI+
Methoden ..
Bitte beachte, dass ich DataPoint
Etiketten zu jedem 10. Punkt in der Schleife hinzugefügt haben, zu zeigen, wo wir sind:
chart1.Series[0].Points.AddXY(i, i);
if (i%10 == 0) chart1.Series[0].Points[i].Label = "#VAL/#VALY";
Danke so viel, TaW. – Viknesh