1

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

这可能与面板控制有关吗?

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

foreach(textbox tb in panel1)
{
}

但我收到一条错误消息,提示面板没有 GetEnumerator 的公共定义。

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


更新提醒一下 - 我在代码中添加多个文本框时遇到了一些问题。我创建了一个文本框对象,然后将其添加到面板中,但只显示了一个。我在本网站的其他地方和其他地方读到过添加同名文本框可能会导致问题。

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

4

5 回答 5

3

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

foreach(Control control in panel.Controls)
{
    if(control is TextBox)
    {
         TextBox textBox = control as TextBox;
         //etc.
    }
}
于 2013-09-10T20:28:01.350 回答
2

您需要访问 Panel 的 Controls 集合,如果您这样做更好:

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

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

于 2013-09-10T20:29:53.177 回答
2

以下示例清除任何控件中的所有文本框

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);
于 2013-09-10T20:30:12.370 回答
1

像这样的东西

foreach (Control c in panel1.Controls)
{
  if(c.GetType() == typeof(TextBox))
  {
     //do stuff
  }
}
于 2013-09-10T20:28:38.510 回答
1

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

foreach (Control c in panel1.Controls)

如果您有多个控件类型,请检查控件类型。

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

于 2013-09-10T20:31:19.347 回答