在C#Windows窗体中添加具有相同名称的不同控件
我在C#windows窗体应用程序中工作,在该应用程序中,我向我的窗体添加了3个具有相同名称的控件(一个按钮、一个文本框和一个标签) 为什么按钮4单击时出错 代码:在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
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!");