【问题标题】:Windows Form Control with Children带子项的 Windows 窗体控件
【发布时间】:2023-04-10 12:04:01
【问题描述】:

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

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

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

foreach(textbox tb in panel1)
{
}

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

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


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

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

【问题讨论】:

  • 确保您的数据结构(本例中为panel1)能够生成迭代器。

标签: c# winforms panel


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    类似的东西

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

    【讨论】:

    • 请注意,在这种情况下,如果有一个控件继承自TextBox,但不是Textbox,则不会对其进行处理。如果您想处理此类项目,请使用IsAssignableFrom,或者更好的是,在Controls 集合上使用OfType
    • c is TextBox 也可以,不是吗?
    • 不,不会。如果一个类型扩展了TextBox,那么someDerivedType is TextBox 返回true。
    【解决方案3】:

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

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

    但是上面会在面板内为您提供文本框,而不是在面板内的其他控件内,如果您想递归获取文本框,请参阅this question

    【讨论】:

      【解决方案4】:

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

      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);
      

      【讨论】:

        【解决方案5】:

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

        foreach (Control c in panel1.Controls)
        

        如果你有多个控件类型,然后检查控件类型。

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

        【讨论】:

          猜你喜欢
          • 2012-11-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-02-26
          • 1970-01-01
          • 1970-01-01
          • 2013-12-20
          • 1970-01-01
          相关资源
          最近更新 更多