如何将数据表与图例键添加到C#中的MS图表? [英] How to add data table with legend keys to a MS Chart in C#?

查看:535
本文介绍了如何将数据表与图例键添加到C#中的MS图表?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有2个名单 listversion & MIN_list 。使用这些列表的值我创建了一个折线图。一切都很好。但我想知道是否可以添加一个图例键的数据表到图表像MS Excel。

There are 2 lists called listversion & MIN_list. Using values of these list I have created a line chart. Everything is work fine. But I am wondering whether it is possible to add a data table with legend keys in to the chart like 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;

我期待这样的东西

如果可能,我该怎么办?

If it is possible How can I do it ?

谢谢。

推荐答案

是的,您可以这样做:

这是我采取的步骤:

首先我们禁用原始的 Legend ,因为它不能以我们需要的方式操作..:

First we disable the original Legend as it can't be manipulated the way we need to..:

chart1.Legends[0].Enabled = false;

现在我们创建一个新的和一个快捷键引用:

Now we create a new one and a shortcut reference to it:

chart1.Legends.Add(new Legend("customLegend"));
Legend L = chart1.Legends[1];

接下来我们做一些定位:

Next we do some positioning:

L.DockedToChartArea = chart1.ChartAreas[0].Name;  // the ca it refers to 
L.Docking = Docking.Bottom;
L.IsDockedInsideChartArea = false;
L.Alignment = StringAlignment.Center; 

现在,我们要为每个系列填写一行标题和一行。

Now we want to fill in one line for headers and one line per series.

我使用一个公共函数为两个和传递一个标志,以指示是否应该填充头(x值)或单元格数据(y值)。这是我如何调用函数:

I use a common function for both and pass in a flag to indicate whether the headers (x-values) or the cell data (y-values) should be filled in. Here is how I call the function:

addValuesToLegend(L, chart1.Series[0], false);
foreach (Series s in chart1.Series) addValuesToLegend(L, s, true);

注意,为了这个工作,我们需要在 / code>:

Note that for this to work we need a few preparations in our Series:


  • 我们需要设置 Series.Colors 显示,否则我们无法参考。

  • 我已向标记每个系列;但是也许你找到一个更好的解决方案,避免硬编码的头的格式。

  • We need to set the Series.Colors explicitly or else we can't refer to them.
  • I have added a format string to the Tag of each series; but maybe you find a better solution that avoids hard-coding the format for the header..

所以这里的函数,填充和一些样式:

So here is the function that does all the filling and some styling:

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 事件:

To draw the borders around the cells of our legend table we need to code the PrePaint event:

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);
    }
}

您可以添加更多样式,如果你可以完美匹配的例子。

You can add more styling although I'm not sure if you can match the example perfectly..

这篇关于如何将数据表与图例键添加到C#中的MS图表?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆