通过基于 name 数组的循环创建图表的许多实例

本文关键字:创建 许多 实例 循环 name 数组 | 更新日期: 2023-09-27 18:31:38

所以基本上我想有一堆图表(会有很多图表),它们通过循环创建具有相同的结构。有没有办法根据它们的名称数组(A1、A2、A3、A4、B1、B2、B3...)生成所有这些(也是图表区和系列名称),同时更改每个新名称的位置?

我真的是 C# 的新手,非常感谢任何帮助。希望有一个解决方案。谢谢!

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

public Main()
{
    System.Windows.Forms.DataVisualization.Charting.ChartArea A1_area =
    new System.Windows.Forms.DataVisualization.Charting.ChartArea();
    this.A1 = new System.Windows.Forms.DataVisualization.Charting.Chart();
    System.Windows.Forms.DataVisualization.Charting.Series series1 = 
    new System.Windows.Forms.DataVisualization.Charting.Series();
    System.Windows.Forms.DataVisualization.Charting.Series series2 = 
    new System.Windows.Forms.DataVisualization.Charting.Series();
    A1_area.Position.Auto = false;
    this.A1.ChartAreas.Add(A1_area);
    this.A1.Location = new System.Drawing.Point(216, 43);
    series1.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.StackedBar100;
    series1.Name = "Series1";
    series2.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.StackedBar100;
    series2.Name = "Series2";
    this.A1.Series.Add(series1);
    this.A1.Series.Add(series2);
    this.A1.Size = new System.Drawing.Size(100, 34);
    this.A1.TabStop = false;
    this.A1.Click += new System.EventHandler(this.A1_Click);
}
private void A1_Click(object sender, EventArgs e)
{
}
private System.Windows.Forms.DataVisualization.Charting.Chart A1;

通过基于 name 数组的循环创建图表的许多实例

首先,您应该将此行与其他包含语句放在一起,以便于语法:

using System.Windows.Forms.DataVisualization.Charting;

我也不确定你真正想要完成什么,但这是我认为你要求的(未经测试):

    public void Main()
    {
        string[] chartNames = { "A1", "A2", "A3", "A4", "B1", "B2", "B3" };
        List<Chart> charts = new List<Chart>;
        int i = 0;
        foreach(string cname in chartNames)
        {
            i++;
            ChartArea chartArea = new ChartArea();
            Chart thisChart = new Chart();
            Series series1 = new Series();
            Series series2 = new Series();
            chartArea.Position.Auto = false;
            thisChart.ChartAreas.Add(chartArea);
            //each chart will be 43 units higher than the last
            thisChart.Location = new System.Drawing.Point(216, (43*i));
            series1.ChartType = SeriesChartType.StackedBar100; 
            series2.ChartType = SeriesChartType.StackedBar100;
            series1.Name = "Series1";
            series2.Name = "Series2";
            thisChart.Series.Add(series1);
            thisChart.Series.Add(series2);
            thisChart.Size = new System.Drawing.Size(100, 34);
            thisChart.TabStop = false;
            //sets the name of this chart to the corresponding string from the array of names
            thisChart.Name = cname;          
            thisChart.Click += new System.EventHandler(this.chartClick);
            //add this chart to the list of charts
            charts.Add(thisChart);
        }     
    }
    private void chartClick(Object sender, EventArgs e)
    {
        //you can differentiate between charts using the sender.name property
        Chart senderChart = (Chart)sender;
        if(senderChart.Name == "A1")
        {
            //if the chart with name A1 is clicked...
        }
    }

此外,您可以在 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);
            }

我还不能发表评论,但可以让你知道从哪里开始。 我没有使用图表类,但类就是类。 不知道具体细节,我在黑暗中刺了一下。 您需要数组中的名称列表来创建具有 1 个图表区、2 个具有设定值的系列的图表列表。 以数组中的名称命名的图表和图表区的名称。 来吧。 您将需要一种方法。 该方法将返回对象图表对象的列表。 图表属性中的"图表"和"图表区"中的"名称"属性将用于按名称引用特定图表,但整个列表将是你放入的任何内容。 来吧。 首先,我不喜欢长名称空间,所以我会添加以下行以使键入更短。

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

您可以使用 foreach 循环浏览每个图表,也可以使用 linq 按控件名称引用特定图表。 控件上没有任何可玩的东西,但对于 linq 控件来说应该是这样的。

var mySelectChart = [Chart]MyListofCharts.First(c => c.Name == "Chart Name");

我将其作为类型图表重新投射出来,因为我相信这可能会将其返回为 IEnumerable 或类似奇怪的东西。

最后是您的活动。 我不知道 Chart 控件,但您的事件必须是动态的,因为您无法以编程方式将新的事件处理程序写入每个图表的代码中。 单击事件中的发送方对象应包含它来自的控件。 如果在单击所在的事件中添加中断并检查发送方对象,则应该能够找到引用它来自的控件的属性。 知道其类型后,您可以将其转换为该类型并直接从对象操作控件,并且可以为所有图表单击事件提供 1 个事件处理程序。