我有一个Windows窗体应用程序,它显示存储在数据库中的数据的图形。我能够将数据显示在条形图或饼图中。但条形图中的图例仅显示“Series1”,即系列的名称。饼图图例显示系列数据的正确图例。我搜索过MSDN并发现了几篇关于添加图例的文章,但它们都有相同的结果。
这是我的条形图代码:
string[] xvals = new string[dt.Rows.Count];
int[] yvals = new int[dt.Rows.Count];
for (int i = 0; i < dt.Rows.Count; i++)
{
xvals[i] = dt.Rows[i]["XValues"].ToString();
yvals[i] = Convert.ToInt32(dt.Rows[i]["YValues"].ToString());
}
Chart barChart = new Chart();
ChartArea chartArea = new ChartArea();
barChart.ChartAreas.Add(chartArea);
barChart.Dock = DockStyle.Fill;
barChart.BackColor = Color.Transparent;
barChart.Palette = ChartColorPalette.Fire;
barChart.ChartAreas[0].BackColor = Color.Transparent;
barChart.ChartAreas[0].AxisX.MajorGrid.Enabled = false;
barChart.ChartAreas[0].AxisY.MajorGrid.Enabled = false;
Series series1 = new Series
{ Name = "Series1", IsVisibleInLegend = true, ChartType = SeriesChartType.Bar };
series1.ChartType = SeriesChartType.Column;
barChart.Series.Add(series1);
for (int i = 0; i < dt.Rows.Count; i++)
{
series1.Points.AddXY(dt.Rows[i]["XValues"].ToString(),
Convert.ToInt32(dt.Rows[i]["YValues"].ToString()));
var p1 = series1.Points[i];
p1.Color = Color.FromArgb((byte)r.Next(90, 255), (byte)r.Next(90, 255), 160);
}
barChart.Legends.Add(new Legend("Legend1"));
barChart.Legends["Legend1"].BackColor = Color.Transparent;
barChart.Series["Series1"].Legend = "Legend1";
series1.IsVisibleInLegend = true;
gbo1.Controls.Add(barChart);
这是我的饼图代码:
string[] xvals = new string[dt.Rows.Count];
int[] yvals = new int[dt.Rows.Count];
for (int i = 0; i < dt.Rows.Count; i++)
{
xvals[i] = dt.Rows[i]["XValues"].ToString();
yvals[i] = Convert.ToInt32(dt.Rows[i]["YValues"].ToString());
}
Chart pieChart = new Chart();
ChartArea chartArea = new ChartArea();
chartArea.Name = "PieChartArea";
pieChart.ChartAreas.Add(chartArea);
pieChart.Dock = DockStyle.Fill;
pieChart.Location = new Point(0, 50);
pieChart.Palette = ChartColorPalette.Fire;
pieChart.BackColor = Color.Transparent;
pieChart.ChartAreas[0].BackColor = Color.Transparent;
Series series2 = new Series
{ Name = "Series2", IsVisibleInLegend = true, ChartType = SeriesChartType.Pie };
pieChart.Series.Add(series2);
for (int i = 0; i < dt.Rows.Count; i++)
{
series2.Points.Add((int)dt.Rows[i]["YValues"]);
var p2 = series2.Points[i];
p2.Color = Color.FromArgb((byte)r.Next(90, 255), (byte)r.Next(90, 255), 160);
p2.LegendText = dt.Rows[i]["XValues"].ToString();
}
pieChart.Legends.Add(new Legend("Legend2"));
pieChart.Legends["Legend2"].BackColor = Color.Transparent;
pieChart.Series["Series2"].Legend = "Legend2";
series2.IsVisibleInLegend = true;
gboReport1.Controls.Add(pieChart);
我错过了什么?请帮忙。
以下是条形图的输出: Bar Chart with bad Legend
以下是饼图的输出: Pie Chart with good Legend
答案 0 :(得分:0)
这就是Bar
和Pie
图表设计的工作方式。
除 ChartTypes
图表外,所有Pie
都会在Series.Names
中显示SeriesTexts
或Legend
。
只有Pie
图表,只有一个 Series
才能显示DataPoint.YValues[0]
。
如果你真的想在你的Legend
中显示数据点数据,你可以这样做,但当然如果添加多个数据点,它看起来会很拥挤......
这是一个如何添加隐藏常规Legend
并添加一个显示数据值的新示例的示例:
chart1.ApplyPaletteColors();
chart1.Legends[0].Enabled = false;
Legend L2 = new Legend();
chart1.Legends.Add(L2);
L2.Docking = Docking.Right;
foreach (DataPoint dp in yourSeries.Points)
{
LegendItem LI = new LegendItem(dp.YValues[0].ToString("0.##"), dp.Color, "");
LI.BorderWidth = 0;
L2.CustomItems.Add(LI);
}
如果您愿意,还可以将这些项目添加到常规Legend
;只需创建一个引用并使用上面的代码:
Legend L1 = chart1.Legends[0];
请注意,您无法删除原始Legend
中的原始项目。