通过基于 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;
首先,您应该将此行与其他包含语句放在一起,以便于语法:
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 个事件处理程序。