【问题标题】:controls with same name in different panels in C#C#中不同面板中具有相同名称的控件
【发布时间】:2015-10-21 18:23:25
【问题描述】:

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

【问题讨论】:

  • 你需要递归查找子控件...我更喜欢使用Generic All controls method
  • 这对我来说看起来很复杂。我是 Windows 窗体的新手。如果我可以在构造函数中访问“this.control_name”,那么为什么不能在“this.Controls”中访问?
  • 因为文本框不属于表单,所以属于面板。
  • 那怎么可能通过'this.button1'而不是'this.panel1.button1'来访问呢? (这部分我很困惑)
  • @NaveenKumarV 您的表单是主要对象。这包含 button1 的变量,因此您可以访问它。但是 ControlsCollection 仅包含直接放置在表单上的所有控件。如果您使用面板,这是一个 IContainerControl。这意味着它可以在其中包含其他控件(例如表单本身)。所以这个面板有它自己的 ControlCollection 以及所有放置在面板上的控件等等。仅仅因为 button1 变量在表单上可用,这并不意味着它被添加到 ControlsCollection。

标签: c# .net winforms controls


【解决方案1】:

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

【讨论】:

  • 感谢您的详细解释。
【解决方案2】:

您必须遍历 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;
        }
    }
}

【讨论】:

  • 好像我必须手动输入表单中每个面板的名称?
  • 不,你可以动态获取它们,我会在编辑中告诉你。
  • 我的面板名称可能不同。我什至可能有“n”个面板、图片框等。这不是动态的。虽然我很欣赏你的工作,兄弟。即使我将使用您的方法:P,@sebi 的答案也很笼统。感谢您的努力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-11
  • 1970-01-01
  • 2017-09-29
  • 2016-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多