Dynamic Variable Name Use in C# for WinForms

2019-02-17 15:09发布

Not sure what is the best way to word this, but I am wondering if a dynamic variable name access can be done in C# (3.5).

Here is the code I am currently looking to "smarten up" or make more elegant with a loop.

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


    }

Is there a way to do something like ("chkCategory" + i.ToString()).Text?

7条回答
不美不萌又怎样
2楼-- · 2019-02-17 15:45

The "this.Controls["chkCategory" + i.ToString()]" and "this.Controls.Find("chkCategory" + i.ToString(), true)" both do not work... the former informs you that the contents of the [] are not an int and the latter that ControlCollection does not contain a definition for Find.

Use "Control myControl1 = FindControl("TextBox2");" instead.

I needed this form as I was looping through another array, extracting values and using them to populate form fields. Much easier to look for label1, label2, label3, etc.

查看更多
在下西门庆
3楼-- · 2019-02-17 15:46

Yes, you can use

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

Add some errorchecking and wrap it in a nice (extension) method.


Edit: It returns Control[] so either a [0] or a .Single() are needed at the end. Added.

查看更多
混吃等死
4楼-- · 2019-02-17 15:57

You can do that with reflection. But don't.

It's more proper to instantiate a list of contols, add them programmatically to your form, and index that.

查看更多
姐就是有狂的资本
5楼-- · 2019-02-17 15:57

Sometimes it can help to put your controls into an array or collection as such:

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

As another approach, you can dynamically create your checkboxes at runtime instead of design time:

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

At least with dynamically created controls, you don't need to modify your GUI or your form code whenever you add new categories.

查看更多
叛逆
6楼-- · 2019-02-17 16:00

No, but you could do something like this (untested, beware of syntax errors):

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

Then you just need to do

for (i = 0; i < 12; i++) allMyCheckboxes[i].Text = categories[i];
查看更多
祖国的老花朵
7楼-- · 2019-02-17 16:09
for(...)
{
     CheckBox c = this.Controls["chkCategory" + i.ToString()] as CheckBox ;

     c.Text = categories[i];  
}
查看更多
登录 后发表回答