2014-11-06 78 views
1

是否可以根据名称设置组件可见属性? 我有12个“主”组件(组合框),如果你想打电话给他们,并根据这些选择我想显示从1到16文本框中的任何地方。这些按数字顺序命名,如combobox1_textbox_0,combobox1_textbox_1等。我想要做的理想是采取组合框的索引,并将其作为参数传递给一个方法,该方法将文本框可见属性设置为可见/隐藏,具体取决于传入方法的索引。基于名称的C#显示组件

这可能吗?在伪代码或者你叫它,我想它的工作是这样的:

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

我可以做面板或东西的选择,但看到所有的组合框的选择将使用相同的文本框,但在不同的似乎有很多工作要为每一种可能的选择制作一个专题讨论小组,而不是稍后难以扩展该计划。

+0

啊忘了提,它的WinForms。 – Gvs 2014-11-09 23:20:16

回答

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. 
+0

谢谢,跟这个一起工作,工作得很完美,救了我至少几百行代码,并且可能还有更多。 – Gvs 2014-11-09 23:18:11

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

甚至更​​多succintly:

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

这听起来像一个聪明的解决方案,但手动不得不放置控件和填充项目(或使他们数据绑定)每次都是多一点时间消耗,然后其他答案 – Gvs 2014-11-09 23:19:28