C#显示基于名称的组件

本文关键字:组件 于名 显示 | 更新日期: 2023-09-27 18:29:23

是否可以根据名称设置组件可见属性?如果你想这样称呼它们,我有12个"主"组件(组合框),根据这些组件中的选择,我想显示1到16个文本框。它们按数字顺序命名,如combobox1_textbox_0、combobox2_textbox_1等等。理想情况下,我想做的是获取combobox的索引,并将其作为参数传递给一个方法,该方法根据传递给该方法的索引将textboxes visible属性设置为visible/hidden。

这可能吗?在伪代码或你称之为的代码中,我希望它能像这样工作:

    private void methodToSetVisibleAttribute(int indexFromMainComboBox)
    {
        for(int i = 0; i < 15; i++)
        {
            if(i < index)
            {
                combobox1_textbox_+i.Visible = true;                
            }
            else
            { 
                combobox1_textbox_+i.Visible = false; 
            }
        }
    }

我可以为选择做面板或其他事情,但由于组合框中的所有选择都将使用相同的文本框,但数量不同,为每个可能的选择制作面板似乎需要做很多工作,更不用说以后很难扩展程序了。

C#显示基于名称的组件

假设您使用的是Windows窗体而不是WPF,则可以使用ControlCollection.Find()按名称查找控件:

var textBox = this.Controls.Find(string.Format("combobox1_textbox_{0}", i), true).OfType<ComboBox>().FirstOrDefault();
if (textBox != null)
    textBox.Visible = (i < index);
else
    Debug.Assert(false, "textbox not found"); // Or throw an exception if you prefer.

我将建议您的方法的替代方案,可能不是您想要的:

将组合框放在List<ComboBox>中,您可以通过索引号访问它们。

List<ComboBox> myCombos = new List<ComboBox>();
for (int i = 0; i < 16; i++)
{
  ComboBox cb = new ComboBox();
  //do what ever you need to do here.  Set its location, add items, etc.
  Form1.Controls.Add(cb); //Alternatively add it to another container.
  myCombos.Add(cb); //Now it's in a list.
}

像这样修改它们:

    for(int i = 0; i < 15; i++)
    {
        if(i < index)
        {
            myCombos[i].Visible = true;                
        }
        else
        { 
            myCombos[i].Visible = false; 
        }
    }

或者更简洁地说:

    for(int i = 0; i < 15; i++)
    {
      myCombos[i].Visible = i < index;
    }