具有子项的窗口窗体控件

本文关键字:窗口 窗体 控件 | 更新日期: 2023-09-27 18:30:47

>我的Windows窗体中有一个面板,我想在其中添加其他控件(如文本框),并循环访问面板中的所有元素以检索其中的所有数据。

可以用面板控件来实现吗?

我尝试了一个 foreach 循环,例如

foreach(textbox tb in panel1)
{
}

但是我收到一个错误,说面板没有GetEnumerator的公共定义。

使用哪个更好的控件/容器,我可以在其中添加更多控件并最终访问其中的所有控件及其数据?


更新请注意 - 我在代码中添加多个文本框时遇到了一些问题。我创建了一个文本框对象,然后将其添加到面板中,但只显示了一个。我已经在这个网站的其他地方读到过,添加具有相同名称的文本框可能会导致问题。

为了解决这个问题,我用一个效果很好的流布局面板替换了面板。希望这对其他人有所帮助。

具有子项的窗口窗体控件

这是

要使用的正确控件。尝试迭代面板对象的 Controls 属性。

foreach(Control control in panel.Controls)
{
    if(control is TextBox)
    {
         TextBox textBox = control as TextBox;
         //etc.
    }
}
下面的示例

清除任何控件中的所有文本框

void ClearTextBoxes(Control parent)
{
    foreach (Control child in parent.Controls)
    {
        TextBox textBox = child as TextBox;
        if (textBox == null)
            ClearTextBoxes(child);
        else
            textBox.Text = string.Empty;
    }
}

然后每当你想要清除时。

ClearTextBoxes(panel1);

您需要访问面板的控件集合,最好这样做:

foreach(Textbox tb in panel1.Controls.OfType<TextBox>)

但是上面会给你面板内的文本框,而不是面板内的其他控件,如果你想递归地获取文本框,那么看看这个问题

你错过了一件小事。尝试:

foreach (Control c in panel1.Controls)

然后检查控件类型中是否有多种类型的控件。

错误的原因是 panel1 是一个对象,而不是对象的集合,因此您必须专门引用 panel1 包含的对象集合。

像这样的东西

foreach (Control c in panel1.Controls)
{
  if(c.GetType() == typeof(TextBox))
  {
     //do stuff
  }
}