C#.NET图表-添加图例滚动条和复选框

蒙蒙加

我正在Visual Studio 2013中使用Chart类来可视化一些数据。但是,我的数据很快产生了许多系列,将所有这些都放在一张图表中非常重要。我将图例区域限制为整个图表区域的20%,因此当我将图表拉伸到最大尺寸时,我几乎不能显示超过7-8个图例项。控件仅在将图例项用完之后才放...。

而不是仅仅写...,是否可以在图例中添加滚动条并能够查看所有项目?我知道我可以通过某种方式实现自己的图例,但我想从Chart类提供的内容中获得最大的收益。我还想在每个图例项旁边添加复选框,以指示该系列是否应该在图表上隐藏。如果没有我自己的图例实现,这有可能吗?

此外,我还想在右键单击图例项目时扩展菜单,其中有几个选项,但这是完全可选的。滚动条和复选框是我现在的主要问题。

谢谢。

帕维尔·韦尔斯伯格

总体思路:您必须创建两个图表。一个是主要的,第二个仅用于传奇。如果系列顺序相同,您将具有相同的系列样式。

要显示弹出窗口,请右键单击图例项目:

将ContextMenu(工具箱中的ContextMenuStrip类)连接到图例的图表。

用于显示图例的隐藏系列:

您必须实现MouseClick事件处理程序,并使用数学GetChildAtPoint()方法检查鼠标光标下的对象(该方法不适用于图例项目)。公式:是series_index = control_relative_mouse_y / c_legendItemHeight这里c_legendItemHeight是您所提供的计算控制高度(图例项目的高度)值。您必须将图例图表配置为包含LegendStyleRowMaximumAutoSize100DockingLeftIsTextAutoFitfalseIsEquallySpacedItemstrue您在图例中定义了3列(一列用于系列样式,第二列用于复选框,第三列用于系列名称)。使用系列CustomProperties保持可见性状态。在检查列中使用此自定义属性(文本="#CUSTOMPROPERTY(...)")以显示检查状态。图表不支持自动调整大小。您可以手动执行。在系列加载期间,将图表高度设置为计算值。该值等于_stock.Shares.Count * c_legendItemHeight + 9其中:_stock.Shares.Count是图例中的项目数,项目的c_legendItemHeight高度恒定(整数值,大于18的数字似乎对我有用),9(似乎是恒定的)。我知道这不好,但找不到更好的解决方案。我在示例中添加了502系列,效果很好。确保图表中没有任何边距,否则将无法正确计算序列号。

对于“传奇中的许多系列”问题:

将图例图表放到启用了AutoScroll属性的面板中。使用上面描述中的表达式设置面板和图例的高度。

源代码:

    public partial class Form1 : Form
    {
        private const int c_legendItemHeight = 20;
        private const string c_checkCustomPropertyName = "CHECK";
        private const string c_checkedString = "✔"; // see http://www.edlazorvfx.com/ysu/html/ascii.html for more
        private const string c_uncheckedString = "✘";
        private Stock _stock;
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            _stock = Stock.Load();

            // mainChart
            mainChart.Legends.Clear();
            foreach (Share share in _stock.Shares)
            {
                Series series = mainChart.Series.Add(share.Name);
                series.ChartType = SeriesChartType.Line;
                foreach (ShareQuotation shareQuotation in share.Quotations)
                {
                    series.Points.AddXY(shareQuotation.Date.ToString(), shareQuotation.Close);
                }
            }

            // LegendChart
            Legend legend = legendChart.Legends[0];
            legendChart.Series.Clear();
            legend.IsTextAutoFit = false;
            legend.IsEquallySpacedItems = true;
            legend.MaximumAutoSize = 100;
            legend.Docking = Docking.Left;
            legend.LegendStyle = LegendStyle.Column;
            legend.Position.Auto = true;
            legend.Position.Width = 100;
            legend.Position.Height = 100;
            legend.CellColumns[1].Text = "#CUSTOMPROPERTY(" +c_checkCustomPropertyName+ ")";

            foreach (Share share in _stock.Shares)
            {
                Series series = legendChart.Series.Add(share.Name);
                series.SetCustomProperty(c_checkCustomPropertyName,c_checkedString);
            }
            legendChart.Height = _stock.Shares.Count * c_legendItemHeight + 9; // 9 - seems to be constant value
            legendPanel.Height = legendChart.Height;

        }



        private void legendChart_MouseClick(object sender, MouseEventArgs e)
        {
            Point mousePosition = legendChart.PointToClient(Control.MousePosition);
            int seriesNo = mousePosition.Y / c_legendItemHeight;
            Series series = legendChart.Series[seriesNo]; // TODO - check if not out of range 

            if (e.Button == System.Windows.Forms.MouseButtons.Left)
            {
                // check uncheck series
                if (series.GetCustomProperty(c_checkCustomPropertyName) == c_checkedString)
                {
                    // if checked
                    // uncheck
                    series.SetCustomProperty(c_checkCustomPropertyName, c_uncheckedString);
                    series.CustomProperties = series.CustomProperties; // workaround - trigger change - is this a bug?
                    // hide in mainChart
                    mainChart.Series[seriesNo].Enabled = false;
                }
                else
                {
                    // if unchecked
                    legendChart.Series[seriesNo].SetCustomProperty(c_checkCustomPropertyName, c_checkedString);
                    series.CustomProperties = series.CustomProperties; // workaround - trigger change - is this a bug?
                    // show in mainChart
                    mainChart.Series[seriesNo].Enabled = true;
                }
            }
        }

        private void contextMenu_Opening(object sender, CancelEventArgs e)
        {
            Point mousePosition = legendChart.PointToClient(Control.MousePosition);
            int seriesNo = mousePosition.Y / c_legendItemHeight;
            Series series = legendChart.Series[seriesNo]; // TODO - check if not out of range 

            contextMenu.Items.Clear();
            string state = series.GetCustomProperty(c_checkCustomPropertyName) == c_checkedString ? "visible" : "hidden";
            contextMenu.Items.Add("&Some strange action for " + state + " item named " + series.Name);
            contextMenu.Items.Add("&Another action ...");
        }
    }

主要表单代码。 在表格上添加了2个图表,一个是主要(<code> mainChart </ code>),第二个仅是图例(<code> legendChart </ code>)。 图例图放置在面板内(“ legendPanel”)

结果应如下所示:

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

TreeView复选框可用作C#.Net中的单个和单独的复选框

来自分类Dev

ASP.NET C# 从 DataTable 创建复选框

来自分类Dev

使用复选框从 gridiew 数据源中选择和删除行 = session C# .net

来自分类Dev

C#实时向图表添加点

来自分类Dev

将图表LegendItem复选框绑定到C#中的WPF中的系列可见性

来自分类Dev

.NET图表图例标记大小

来自分类Dev

如何从C#生成图形和图表

来自分类Dev

基于C#中的DropDownList在Asp.net Gridview中启用“禁用”复选框

来自分类Dev

asp net c#使用复选框获取gridview中特定行的值

来自分类Dev

如何在列表视图中控制复选框状态asp.net C#

来自分类Dev

ASP.NET MVC视图中的C#复选框事件不在窗体内

来自分类Dev

使用asp.net在C#中动态创建的复选框垂直显示

来自分类Dev

ASP.NET将复选框值获取到C#方法

来自分类Dev

ASP.NET Web Api 2 c#中的单选按钮、下拉列表、复选框

来自分类Dev

在ASP中使用按钮添加复选框-C#

来自分类Dev

C#复选框和鼠标单击事件

来自分类Dev

C#的滚动条装饰?

来自分类Dev

如何以编程方式实现带有复选框和滚动条的动态GUI?

来自分类Dev

我需要固定宽度和右侧复选框的水平滚动条

来自分类Dev

C#动态删除复选框

来自分类Dev

C#图表ArguementOutOfRangeExecption

来自分类Dev

在ASP.NET(C#)中使用Telerik radgrid选择服务器端复选框

来自分类Dev

在ASP.NET(C#)中使用Telerik radgrid选择服务器端复选框

来自分类Dev

C#重定向到时的GridView复选框被选中其他页面asp.net

来自分类Dev

动态将文本框添加到C#.net中的数据绑定复选框列表

来自分类Dev

在C#中向图表添加水平线

来自分类Dev

将轴名称添加到图表C#

来自分类Dev

将轴名称添加到图表C#

来自分类Dev

C#在图表上添加到Y值

Related 相关文章

  1. 1

    TreeView复选框可用作C#.Net中的单个和单独的复选框

  2. 2

    ASP.NET C# 从 DataTable 创建复选框

  3. 3

    使用复选框从 gridiew 数据源中选择和删除行 = session C# .net

  4. 4

    C#实时向图表添加点

  5. 5

    将图表LegendItem复选框绑定到C#中的WPF中的系列可见性

  6. 6

    .NET图表图例标记大小

  7. 7

    如何从C#生成图形和图表

  8. 8

    基于C#中的DropDownList在Asp.net Gridview中启用“禁用”复选框

  9. 9

    asp net c#使用复选框获取gridview中特定行的值

  10. 10

    如何在列表视图中控制复选框状态asp.net C#

  11. 11

    ASP.NET MVC视图中的C#复选框事件不在窗体内

  12. 12

    使用asp.net在C#中动态创建的复选框垂直显示

  13. 13

    ASP.NET将复选框值获取到C#方法

  14. 14

    ASP.NET Web Api 2 c#中的单选按钮、下拉列表、复选框

  15. 15

    在ASP中使用按钮添加复选框-C#

  16. 16

    C#复选框和鼠标单击事件

  17. 17

    C#的滚动条装饰?

  18. 18

    如何以编程方式实现带有复选框和滚动条的动态GUI?

  19. 19

    我需要固定宽度和右侧复选框的水平滚动条

  20. 20

    C#动态删除复选框

  21. 21

    C#图表ArguementOutOfRangeExecption

  22. 22

    在ASP.NET(C#)中使用Telerik radgrid选择服务器端复选框

  23. 23

    在ASP.NET(C#)中使用Telerik radgrid选择服务器端复选框

  24. 24

    C#重定向到时的GridView复选框被选中其他页面asp.net

  25. 25

    动态将文本框添加到C#.net中的数据绑定复选框列表

  26. 26

    在C#中向图表添加水平线

  27. 27

    将轴名称添加到图表C#

  28. 28

    将轴名称添加到图表C#

  29. 29

    C#在图表上添加到Y值

热门标签

归档