如何将带有图例键的数据表添加到 C# 中的 MS 图表?
Posted
技术标签:
【中文标题】如何将带有图例键的数据表添加到 C# 中的 MS 图表?【英文标题】:How to add data table with legend keys to a MS Chart in C#? 【发布时间】:2016-06-17 22:42:02 【问题描述】:有 2 个列表,分别称为 listversion 和 MIN_list。使用这些列表的值,我创建了一个折线图。一切正常。但我想知道是否可以在 MS Excel 等图表中添加带有图例键的数据表。
chart.Series.Clear();
chart.ChartAreas[0].AxisX.Title = "Version";
chart.ChartAreas[0].AxisX.TitleFont = new System.Drawing.Font("Arial", 12, FontStyle.Regular);
chart.ChartAreas[0].AxisY.Title = "Time";
chart.ChartAreas[0].AxisY.TitleFont = new System.Drawing.Font("Arial", 12, FontStyle.Regular);
Series MIN = chart.Series.Add("Minimum");
MIN.Points.DataBindXY(listVersion, MIN_list[j]);
MIN.ChartType = SeriesChartType.Line;
MIN.Color = Color.Red;
MIN.BorderWidth = 3;
我很期待这样的事情
如果可以的话,我该怎么做?
谢谢。
【问题讨论】:
用相同的数据创建 2 个图表,然后将一个拖放到另一个上? 我已经更新了答案以显示如何添加单元格边框。 您的问题解决了吗? 感谢您的帮助。我没有解决它,但我能够改变客户的想法。 :) 【参考方案1】:是的,您可以这样做:
这是我采取的步骤:
首先我们禁用原始的Legend
,因为它不能按照我们需要的方式进行操作..:
chart1.Legends[0].Enabled = false;
现在我们创建一个新的和一个对其的快捷方式引用:
chart1.Legends.Add(new Legend("customLegend"));
Legend L = chart1.Legends[1];
接下来我们做一些定位:
L.DockedToChartArea = chart1.ChartAreas[0].Name; // the ca it refers to
L.Docking = Docking.Bottom;
L.IsDockedInsideChartArea = false;
L.Alignment = StringAlignment.Center;
现在我们要为标题填写一行,每个系列填写一行。
我对两者都使用一个通用函数,并传入一个标志来指示是否应填写标题(x 值)或单元格数据(y 值)。这是我调用函数的方式:
addValuesToLegend(L, chart1.Series[0], false);
foreach (Series s in chart1.Series) addValuesToLegend(L, s, true);
请注意,要使其正常工作,我们需要在 Series
中进行一些准备工作:
Series.Colors
,否则我们无法引用它们。
我已在每个系列的Tag
中添加了格式字符串;但也许你会找到一个更好的解决方案,避免对标题格式进行硬编码..
所以这是完成所有填充和一些样式的函数:
void addValuesToLegend(Legend L, Series S, bool addYValues)
// create a new row for the legend
LegendItem newItem = new LegendItem();
// if the series has a markerstyle we show it:
newItem.MarkerStyle = S.MarkerStyle ;
newItem.MarkerColor = S.Color;
newItem.MarkerSize *= 2; // bump up the size
if (S.MarkerStyle == MarkerStyle.None)
// no markerstyle so we just show a colored rectangle
// you could add code to show a line for other chart types..
newItem.ImageStyle = LegendImageStyle.Rectangle;
newItem.BorderColor = Color.Transparent;
newItem.Color = S.Color;
else newItem.ImageStyle = LegendImageStyle.Marker;
// the rowheader shows the marker or the series color
newItem.Cells.Add(LegendCellType.SeriesSymbol, "", ContentAlignment.MiddleCenter);
// add series name
newItem.Cells.Add(LegendCellType.Text, addYValues ? S.Name : "",
ContentAlignment.MiddleLeft);
// combine the 1st two cells:
newItem.Cells[1].CellSpan = 2;
// we hide the first cell of the header row
if (!addYValues)
newItem.ImageStyle = LegendImageStyle.Line;
newItem.Color = Color.Transparent;
newItem.Cells[0].Tag = "*"; // we mark the 1st cell for not painting it
// now we loop over the points:
foreach (DataPoint dp in S.Points)
// we format the y-value
string t = dp.YValues[0].ToString(S.Tag.ToString());
// or maybe the x-value. it is a datatime so we need to convert it!
// note the escaping to work around my european locale!
if (!addYValues) t = DateTime.FromOADate(dp.XValue).ToString("M\\/d\\/yyyy");
newItem.Cells.Add(LegendCellType.Text, t, ContentAlignment.MiddleCenter);
// we can create some white space around the data:
foreach (var cell in newItem.Cells) cell.Margins = new Margins(25, 20, 25, 20);
// finally add the row of cells:
L.CustomItems.Add(newItem);
要在图例表的单元格周围绘制边框,我们需要编写 PrePaint
事件:
private void chart1_PrePaint(object sender, ChartPaintEventArgs e)
LegendCell cell = e.ChartElement as LegendCell;
if (cell != null && cell.Tag == null)
RectangleF r = e.ChartGraphics.GetAbsoluteRectangle(e.Position.ToRectangleF());
e.ChartGraphics.Graphics.DrawRectangle(Pens.DimGray,Rectangle.Round(r));
// Let's hide the left border when there is a cell span!
if (cell.CellSpan != 1)
e.ChartGraphics.Graphics.DrawLine(Pens.White,
r.Left, r.Top+1, r.Left, r.Bottom-1);
您可以添加更多样式,但我不确定您是否可以完美匹配示例..
【讨论】:
以上是关于如何将带有图例键的数据表添加到 C# 中的 MS 图表?的主要内容,如果未能解决你的问题,请参考以下文章
使用 c# 将 MS Access 表数据添加到 SQL Server 表中
如何使用 C# 在 MS-Access 中的查询中使用带有通配符的 LIKE 运算符
C# Entity Framework Code-First-如何仅使用该外键的 id 添加带有外键的行?