2014-11-06 79 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