在C#Windows窗体中添加具有相同名称的不同控件

在C#Windows窗体中添加具有相同名称的不同控件,c#,.net,winforms,controls,C#,.net,Winforms,Controls,我在C#windows窗体应用程序中工作,在该应用程序中,我向我的窗体添加了3个具有相同名称的控件(一个按钮、一个文本框和一个标签) 为什么按钮4单击时出错 代码: private void button1_Click(object sender, EventArgs e) { TextBox myControl = new TextBox(); myControl.Name = "myControl"; this.Controls.Add(m

我在C#windows窗体应用程序中工作,在该应用程序中,我向我的窗体添加了3个具有相同名称的控件(一个按钮、一个文本框和一个标签)

为什么按钮4单击时出错

代码:

 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
 }
this.Controls[“myControl”]
返回名为
myControl
的第一个控件

这是一个文本框,不是标签


不要通过
控件
集合访问控件,而应该将控件存储在表单类的字段中(可能使用
列表
s)。

控件[string]索引器返回名称与字符串匹配的第一个控件。您的代码可能会命中不中,但您可能已经在表单中添加了一个同名的组合框。下一个语句会跳转,因为您无法将组合框转换为文本框


当然,一定要做明智的事情,给这些控件起不同的名字。

这里有一个想法可能会对您有所帮助:

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

此函数将遍历表单上的所有控件,当它找到使用指定名称指定的控件类型时,它将更新controls.Text字段。

您应该命名按钮。我想知道这些按钮是否都以相同的名称添加到表单中。怎么做?呃,只需迭代控件并计算具有该名称的控件?这有什么意义?
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!");