动态变量名称在C#中用于WinForms

不确定说出这个的最好方法是什么,但我想知道是否可以在C#(3.5)中完成动态变量名访问。

这是我目前正在寻找“智能化”或通过循环使其更优雅的代码。

private void frmFilter_Load(object sender, EventArgs e) { chkCategory1.Text = categories[0]; chkCategory2.Text = categories[1]; chkCategory3.Text = categories[2]; chkCategory4.Text = categories[3]; chkCategory5.Text = categories[4]; chkCategory6.Text = categories[5]; chkCategory7.Text = categories[6]; chkCategory8.Text = categories[7]; chkCategory9.Text = categories[8]; chkCategory10.Text = categories[9]; chkCategory11.Text = categories[10]; chkCategory12.Text = categories[11]; } 

有没有办法做类似的事情(“chkCategory”+ i.ToString())。文字?

 for(...) { CheckBox c = this.Controls["chkCategory" + i.ToString()] as CheckBox ; c.Text = categories[i]; } 

是的,你可以使用

  Control c = this.Controls.Find("chkCategory" + i.ToString(), true).Single(); (c as textBox).Text = ...; 

添加一些错误检查并将其包装在一个漂亮的(扩展)方法中。


编辑:它返回Control[]因此最后需要[0].Single() 。 添加。

你可以用reflection做到这一点。 但不要。

实例化一个contol列表,以编程方式将它们添加到表单并对其进行索引更为合适。

有时它可以帮助您将控件放入数组或集合中:

 Checkbox[] chkCataegories = new Checkbox[] { chkCategory1, chkCategory2 ... }; for(int i = 0; i < chkCategories.Length; i++) chkCategories[i].Text = categories[i]; 

作为另一种方法,您可以在运行时而不是设计时动态创建复选框:

 for(int i = 0; i < categories.Length; i++) { Checkbox chkCategory = new chkCategory { Text = categories[i] }; someContainer.Controls.Add(chkCategory); } 

至少使用动态创建的控件,无论何时添加新类别,都不需要修改GUI或表单代码。

你不需要动态。 将chkCategory1 – 12放在一个数组中,并使用for循环遍历它。 我建议你把它保存在一个字段中并在表单构建时初始化它,因为chkCategory似乎是相关的。 但是如果你想要一个简单的例子来说明如何在这个简单的方法中做到这一点,那么它将是这样的:

 private void frmFilter_Load(object sender, EventArgs e) { var chkCategories = new [] { chkCategory1, chkCategory2, chkCategory3, .......... }; for(int i = 0 ; i < chkCategories.Length ; i++ ) chkCategoies[i].Text = categories[i]; } 

您对应用程序有了更多了解,因此您可以避免写出所有控件名称 - 例如,如果将它们放在公共父控件上,那么您可以通过查看它的子项来查找它们。

不,但你可以这样做(未经测试,谨防语法错误):

 private readonly CheckBox[] allMyCheckboxes = new CheckBox[] { chkCategory1, chkCategory2, ... } 

那你就需要做

 for (i = 0; i < 12; i++) allMyCheckboxes[i].Text = categories[i]; 

“this.Controls [”chkCategory“+ i.ToString()]”和“this.Controls.Find(”chkCategory“+ i.ToString(),true)”都不起作用……前者通知你[]的内容不是int,后者是ControlCollection不包含Find的定义。

使用“Control myControl1 = FindControl(”TextBox2“);” 代替。

我需要这个表单,因为我循环遍历另一个数组,提取值并使用它们来填充表单字段。 更容易找到label1,label2,label3等。