C#根据名称显示组件

时间:2014-11-06 21:07:45

标签: c# winforms combobox textbox components

是否可以根据名称设置组件可见属性? 我有12个“主”组件(组合框),如果你想调用它们,并根据这些中的选择我想显示1到16个文本框的任何地方。它们以数字顺序命名,例如combobox1_textbox_0,combobox1_textbox_1等。我理想的做法是取组合框的索引并将其作为参数传递给一个方法,该方法根据传递给方法的索引将文本框可见属性设置为可见/隐藏。

这可能吗?在伪代码或你所谓的它我希望它能像这样工作:

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

我可以选择面板或其他东西进行选择,但是看到组合框中的所有选择都将使用相同的文本框,但是以不同的数量,为每个可能的选择制作面板似乎有很多工作,更不用说难以扩展了该计划后来。

2 个答案:

答案 0 :(得分:1)

假设您使用的是Windows Forms而非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.

答案 1 :(得分:1)

我建议您采用替代方法,或许不是您正在寻找的方法:

将您的组合框放在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;
    }