Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C中不同面板中具有相同名称的控件#_C#_.net_Winforms_Controls - Fatal编程技术网

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

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)

在我的表单中,我创建了两个面板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;
        }
    }
}
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的答案是如此普通。谢谢你的努力。谢谢你的详细解释。