具有子项的窗口窗体控件
本文关键字:窗口 窗体 控件 | 更新日期: 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
}
}