在 C# 中的不同面板中具有相同名称的控件
controls with same name in different panels in C#
在我的表单中,我创建了两个面板 panel1 和 panel2,在每个面板中我创建了一个名为 的按钮button1 和 button2 分别。
如果我想使用
添加事件处理程序
this.button1.Click += buttonEvent;
没问题。但是,当我对表单中的每个控件使用 foreach 时,未检测到它。
这里有什么问题?
public myForm1()
{
InitializeComponent();
foreach (Control c in this.Controls)
{
TextBox tb = c as TextBox;
if (tb != null)
{
tb.TextChanged += textChanged;
}
}
}
如何使用 foreach 访问每个面板中的控件?
您必须迭代 panel1
和 panel2
中的控件,而不是 myForm1
。
public myForm1()
{
InitializeComponent();
foreach(Control c in panel1.Controls)
{
TextBox tb = c as TextBox;
if(tb != null)
{
tb.TextChanged += textChanged;
}
}
}
编辑
从表单中获取面板:
for(int i = 0; i < 2; i++)
{
Panel p = this.Controls["panel" + i];
foreach(Control c in p.Controls)
{
TextBox tb = c as TextBox;
if(tb != null)
{
tb.TextChanged += textChanged;
}
}
}
在您的表单中,控件集合仅获得面板。因为面板是一个容器(如窗体),所以它有自己的控件集合。所以你必须递归迭代以获得所有子控件。因此,如果检测到新的 IContainerControl(如面板或用户控件等),您也要检查它们。
在您的情况下,面板控件集合将包含该按钮。
例如,此方法应搜索项目:
容器应该是你的表单。
private Control SearchControl(IContainerControl container, string name)
{
foreach (Control control in this.Controls)
{
if (control.Name.Equals(name))
{
return control;
}
if (control is IContainerControl)
{
return SearchControl(control as IContainerControl, name);
}
}
return null;
}
在我的表单中,我创建了两个面板 panel1 和 panel2,在每个面板中我创建了一个名为 的按钮button1 和 button2 分别。 如果我想使用
添加事件处理程序this.button1.Click += buttonEvent;
没问题。但是,当我对表单中的每个控件使用 foreach 时,未检测到它。 这里有什么问题?
public myForm1()
{
InitializeComponent();
foreach (Control c in this.Controls)
{
TextBox tb = c as TextBox;
if (tb != null)
{
tb.TextChanged += textChanged;
}
}
}
如何使用 foreach 访问每个面板中的控件?
您必须迭代 panel1
和 panel2
中的控件,而不是 myForm1
。
public myForm1()
{
InitializeComponent();
foreach(Control c in panel1.Controls)
{
TextBox tb = c as TextBox;
if(tb != null)
{
tb.TextChanged += textChanged;
}
}
}
编辑
从表单中获取面板:
for(int i = 0; i < 2; i++)
{
Panel p = this.Controls["panel" + i];
foreach(Control c in p.Controls)
{
TextBox tb = c as TextBox;
if(tb != null)
{
tb.TextChanged += textChanged;
}
}
}
在您的表单中,控件集合仅获得面板。因为面板是一个容器(如窗体),所以它有自己的控件集合。所以你必须递归迭代以获得所有子控件。因此,如果检测到新的 IContainerControl(如面板或用户控件等),您也要检查它们。
在您的情况下,面板控件集合将包含该按钮。
例如,此方法应搜索项目:
容器应该是你的表单。
private Control SearchControl(IContainerControl container, string name)
{
foreach (Control control in this.Controls)
{
if (control.Name.Equals(name))
{
return control;
}
if (control is IContainerControl)
{
return SearchControl(control as IContainerControl, name);
}
}
return null;
}