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

controls with same name in different panels in C#

在我的表单中,我创建了两个面板 panel1panel2,在每个面板中我创建了一个名为 的按钮button1button2 分别。 如果我想使用

添加事件处理程序
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 访问每个面板中的控件?

您必须迭代 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;
        }
    }
}

在您的表单中,控件集合仅获得面板。因为面板是一个容器(如窗体),所以它有自己的控件集合。所以你必须递归迭代以获得所有子控件。因此,如果检测到新的 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;
}