C# C中不同面板中具有相同名称的控件#
在我的表单中,我创建了两个面板panel1和panel2,在每个面板中我分别创建了一个名为button1和button2的按钮。 如果要使用添加事件处理程序C# C中不同面板中具有相同名称的控件#,c#,.net,winforms,controls,C#,.net,Winforms,Controls,在我的表单中,我创建了两个面板panel1和panel2,在每个面板中我分别创建了一个名为button1和button2的按钮。 如果要使用添加事件处理程序 this.button1.Click += buttonEvent; 很好。但是,当我对表单中的每个控件使用foreach时,它不会被检测到。 这里有什么问题 public myForm1() { InitializeComponent(); foreach (Control c in this.Controls)
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;
}
}
}
for(int i=0;i<2;i++)
{
面板p=此。控制[“面板”+i];
foreach(p.Controls中的控件c)
{
文本框tb=c作为文本框;
如果(tb!=null)
{
tb.TextChanged+=TextChanged;
}
}
}
在您的表单中,控件集合仅获取面板。因为面板是一个容器(作为表单),所以它有自己的控件集合。因此,为了获得所有子控件,您必须递归地进行迭代。因此,如果检测到新的IContainerControl,如panel或usercontrol等,您也会检查它们
在您的情况下,“面板控件”集合将包含该按钮
例如,此方法应搜索项目:
容器应该是您的表单
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;
}
您需要递归地查找子控件。。。我更喜欢用对我来说比较复杂的。我不熟悉windows窗体。如果我可以在构造函数中访问'this.control_name',那么为什么不能在'this.Controls'中访问呢?因为文本框不属于表单,它们属于面板。那么如何通过'this.button1'而不是'this.panel1.button1'访问呢?(这部分我很困惑)@NaveenKumarV你的身体是主要的对象。它包含button1变量,因此您可以访问它。但是ControlsCollection只包含直接放置在窗体上的所有控件。如果使用面板,则这是IContainer控件。这意味着它可以在其中保存其他控件(如表单本身)。因此,这个面板有自己的ControlCollection,其中包含放置在面板上的所有控件,依此类推。仅仅因为button1变量在表单上可用,这并不意味着它被添加到ControlsCollection。似乎我必须手动输入表单中每个面板的名称?不,您可以动态获取它们。我将在编辑中显示给您。我的面板名称可能不同。我甚至可能有n个面板、图片盒等。这不是动态的。虽然我很欣赏你的工作,兄弟。尽管我将使用你的方法:P,@sebi的答案是如此普通。谢谢你的努力。谢谢你的详细解释。