C#中不同面板中具有相同名称的控件

时间:2015-10-21 09:17:20

标签: c# .net winforms controls

在我的表单中,我创建了两个面板 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 访问我的每个面板中的控件?

2 个答案:

答案 0 :(得分:1)

您必须遍历panel1panel2而不是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;
        }
    }
}

答案 1 :(得分:1)

在您的表单中,Controls Collection只获得了面板。因为面板是一个Container(作为Form),它有自己的Controls Collection。因此,您必须递归迭代才能获得所有子控件。因此,如果检测到新的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;
}