2010-11-28 28 views
1

我在C#窗體窗體應用程序中工作,我在其中添加3個具有相同名稱的不同控件(一個按鈕,一個文本框&一個標籤)到我的窗體。在C#窗口中添加具有相同名稱的不同控件

爲什麼button4_Click中有錯誤?

CODE:

private void button1_Click(object sender, EventArgs e) 
{ 
     TextBox myControl = new TextBox(); 
     myControl.Name = "myControl"; 
     this.Controls.Add(myControl); 
} 

private void button2_Click(object sender, EventArgs e) 
{ 
     Button myControl = new Button(); 
     myControl.Name = "myControl"; 
     this.Controls.Add(myControl); 
} 

private void button3_Click(object sender, EventArgs e) 
{ 
     Label myControl = new Label(); 
     myControl.Name = "myControl"; 
     this.Controls.Add(myControl); 
} 

private void button4_Click(object sender, EventArgs e) 
{ 
     ((ComboBox)this.Controls["myControl"]).Text = "myCombo"; // works 
     ((TextBox)this.Controls["myControl"]).Text = "myText"; // error 
     ((Label)this.Controls["myControl"]).Text = "myLabel"; // error 
} 
+1

你應該命名你的按鈕。 – SLaks 2010-11-28 18:36:50

回答

2

Controls [string]索引器返回名稱與字符串匹配的第一個控件。它會被你的代碼擊中而錯過,但你可能已經有一個ComboBox已經添加到同名的表單。接下來的語句發送到kaboom,因爲您不能將ComboBox強制轉換爲TextBox。

當然,儘量做到理智的事情,給這些控件不同的名稱。

+0

我想知道這些全部都是以相同的名字加入。怎麼樣? – 2010-11-28 18:43:32

0

this.Controls["myControl"]返回名爲myControl第一控制。

這是一個TextBox,而不是標籤。

而不是通過Controls集合訪問它們,您應該將控件存儲在窗體類中的字段中(可能使用List<T> s)。

0

這裏有一個想法,可以幫助你:

void SetControlText(Type controlType, string controlName, string text) { 
     foreach (var ctl in this.Controls.OfType<Control>()) { 
     if (ctl.GetType() == controlType && ctl.Name == controlName) { 
      ctl.Text = text; 

      break; 
     } 
     } 
    } 

或只LINQ:

var item = this.Controls.OfType<Control>().Where(j => j.GetType() == controlType && j.Name == controlName).FirstOrDefault(); 
     if (item != null) 
     item.Text = text; 

只需調用上面的函數,像這樣:

SetControlText(typeof(Button), "myButton", "Text was set!"); 

此功能將遍歷表單上的所有控件,以及何時找到您用nam指定的控件類型如果您指定,它將更新控件.Text字段。

相關問題