在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访问我的每个面板中的控件?


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

您必须迭代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;
        }
    }
}
链接地址: http://www.djcxy.com/p/61571.html

上一篇: controls with same name in different panels in C#

下一篇: How prevent Controls binding to Panel