代码之家  ›  专栏  ›  技术社区  ›  Awaken

在C#for WinForms中使用动态变量名

  •  5
  • Awaken  · 技术社区  · 14 年前

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

        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()).Text的操作?

    7 回复  |  直到 14 年前
        1
  •  5
  •   Rony    14 年前
    for(...)
    {
         CheckBox c = this.Controls["chkCategory" + i.ToString()] as CheckBox ;
    
         c.Text = categories[i];  
    }
    
        2
  •  6
  •   Henk Holterman    14 年前

    是的,你可以用

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

    添加一些错误检查并用一个好的(扩展)方法包装它。


    编辑:返回 Control[] [0] .Single() 最后需要。补充。

        3
  •  2
  •   user180326 user180326    14 年前

    你可以通过反射来实现。但是不要。

        4
  •  1
  •   Juliet    14 年前

    有时,将控件放入数组或集合会有所帮助:

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

        5
  •  0
  •   driis    14 年前

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

    您对应用程序了解得更多,因此可以避免写出所有控件名—例如,如果它们放在一个公共父控件上,则可以通过检查其子控件来找到它们。

        6
  •  0
  •   Heinzi    14 年前

    不,但您可以这样做(未经测试,请注意语法错误):

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

    for (i = 0; i < 12; i++) allMyCheckboxes[i].Text = categories[i];
    
        7
  •  0
  •   Jon    12 年前

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

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