C# 通过基于名称数组的循环创建图表的多个实例

C# 通过基于名称数组的循环创建图表的多个实例,c#,arrays,charts,C#,Arrays,Charts,因此,基本上我希望通过循环创建一组具有相同结构的图表(将会有很多)。是否有一种方法可以根据它们的名称数组(A1、A2、A3、A4、B1、B2、B3…)生成所有这些名称(以及图表区域和系列名称),同时更改每个新名称的位置 我对C#很陌生,非常感谢您的帮助。希望有解决办法。谢谢大家! 单个图表的代码如下所示(还有一些行,但我只显示结构): 首先,您应该将这一行与其他include语句放在一起,以便使用更简单的语法: using System.Windows.Forms.DataVisualizati

因此,基本上我希望通过循环创建一组具有相同结构的图表(将会有很多)。是否有一种方法可以根据它们的名称数组(A1、A2、A3、A4、B1、B2、B3…)生成所有这些名称(以及图表区域和系列名称),同时更改每个新名称的位置

我对C#很陌生,非常感谢您的帮助。希望有解决办法。谢谢大家!

单个图表的代码如下所示(还有一些行,但我只显示结构):


首先,您应该将这一行与其他include语句放在一起,以便使用更简单的语法:

using System.Windows.Forms.DataVisualization.Charting;
我也不确定你到底想要完成什么,但我认为这是你要求的(未经测试):


我还不能发表评论,但可以让你知道从哪里开始。我没有使用图表类,但类是类。不知道具体情况我在暗中试探。您需要数组中的名称列表来创建一个图表列表,其中包含1个chartarea,2个带有设置值的系列。以数组中的名称命名的图表和图表区域的名称。我们开始吧。你需要一个方法。该方法将返回对象图表对象的列表。Chart属性中的Name属性和Chart属性中的ChartArea将用于按名称引用特定图表,但整个列表将是您放入其中的任何内容。我们开始吧。首先,我不喜欢长的名字空间,所以我会在下面加上一行,以缩短键入的时间

using System.Windows.Forms.DataVisualization.Charting;

private List<Chart> MakeCharts(string[] YourArray)
{
    var myChart = new List<Chart>();
    Foreach(string chName in YourArray)
    {
        ChartArea area = new ChartArea();
        area.Name = chName;
        Chart chart = new Chart();
        chart.Name = chName;
        Series series1 = new Series();
        Series series2 = new Series();

        area.Position.Auto = false;
        chart.ChartAreas.Add(area);
        chart.Location = new System.Drawing.Point(216, 43);
        series1.ChartType = SeriesChartType.StackedBar100;
        series1.Name = "Series1";
        series2.ChartType = SeriesChartType.StackedBar100;
        series2.Name = "Series2";

        chart.Series.Add(series1);
        chart.Series.Add(series2);

        chart.Size = new System.Drawing.Size(100, 34);
        chart.TabStop = false;

        //Here is the tricky part.  See explanation after code.
        chart.Click += new System.EventHandler(charts_Click);
        myChart.Add(chart);
    }

    return myChart;
}
您可以使用foreach循环浏览每个图表,或者使用linq通过其控件名引用特定的图表。没有任何东西可以玩的控制,但应该像这样的linq之一

var mySelectChart = [Chart]MyListofCharts.First(c => c.Name == "Chart Name");
我把它作为一个类型图扔掉,因为我相信这可能会返回IEnumerable或者类似的奇怪的东西


最后是你的活动。我不知道图表控件,但您的事件必须是动态的,因为您无法通过编程将新的事件处理程序写入每个图表的代码中。click事件中的sender对象应该包含它来自的控件。如果在click所在的事件中添加一个中断并检查sender对象,则应该能够找到引用它来自的控件的属性。一旦知道了它的类型,您就可以将它转换为该类型,并从对象中操作控件权限,并且可以为所有图表单击事件使用一个事件处理程序。

您是否考虑过使用数组/图表列表?谢谢您的回答。是的,我试图使用列表,但无法使其工作。我在谷歌上搜索过任何类似的例子,但没有找到。也许你可以给我一个提示或者smth上的任何类似链接?
我在谷歌上搜索了任何类似的例子,但没有发现任何一个
是第一个创建如此难以置信的代码的人……嗯,我只是在学习。我很享受目前的体验,但我认为我还不能创造出让自己变得复杂的东西。哇,非常感谢你的时间!这个解决方案完全符合我的要求。另外,使用foreach循环设置名称也应该很方便。再次感谢你,谢谢你抽出时间!我已经尝试过前面提出的解决方案,但出于教育目的,我也将尝试你的解决方案,因为我真的不善于使用方法。谢谢
            if(cname == "A1")
            {
                //set properties for chart with name A1
                series1.Name = "A1 series 1";
                series2.Name = "A2 series 2";
                thisChart.Size = new System.Drawing.Size(200, 50);
            }
using System.Windows.Forms.DataVisualization.Charting;

private List<Chart> MakeCharts(string[] YourArray)
{
    var myChart = new List<Chart>();
    Foreach(string chName in YourArray)
    {
        ChartArea area = new ChartArea();
        area.Name = chName;
        Chart chart = new Chart();
        chart.Name = chName;
        Series series1 = new Series();
        Series series2 = new Series();

        area.Position.Auto = false;
        chart.ChartAreas.Add(area);
        chart.Location = new System.Drawing.Point(216, 43);
        series1.ChartType = SeriesChartType.StackedBar100;
        series1.Name = "Series1";
        series2.ChartType = SeriesChartType.StackedBar100;
        series2.Name = "Series2";

        chart.Series.Add(series1);
        chart.Series.Add(series2);

        chart.Size = new System.Drawing.Size(100, 34);
        chart.TabStop = false;

        //Here is the tricky part.  See explanation after code.
        chart.Click += new System.EventHandler(charts_Click);
        myChart.Add(chart);
    }

    return myChart;
}
var MyListofCharts = MakeCharts(myArrayofNames);
var mySelectChart = [Chart]MyListofCharts.First(c => c.Name == "Chart Name");