下面的图片代表了我正在构建的插件。
黄色 = tabControl1; 橙色 = tabPage1; 蓝色 =主面板(mainPanel); 绿色 =主面板中的3个不同的面板(panel1,panel2和panel3); 白色 =文本框(我要清除); DarkBlue =对应于绿色面板的复选框
我尝试清除文本框中的所有文本(如果其中包含文本),并清除复选框(如果通过单击按钮选中)。
我在网上进行了研究,并尝试通过以下方法来实现这一目标,但这似乎并不是解决此问题的正确方法。
foreach (Control a in tabControl1.Controls)
{
foreach(Control b in tabPage1.Controls)
{
foreach (Control c in mainPanel.Controls)
{
foreach (Control d in panel1.Controls)
{
if (d is TextBox)
{
d.Text = " ";
}
if (d is CheckBox)
{
((CheckBox)d).Checked = false;
}
}
}
}
}
我在这里只显示了panel1,但是也尝试对面板2和3做同样的事情。
我到底在做什么错?任何帮助将不胜感激!
答案 0 :(得分:2)
您只需要一个简单的递归方法,即可在此处指定的父容器 mainPanel
的所有子容器中迭代所有控件。
如果控件的类型为TextBox或CheckBox,则相应地设置其Text
或Checked
属性:
(请注意,您也可以将tabPage1
传递给方法或任何其他祖先)
ClearControls(panel1);
// or
ClearControls(tabPage1);
private void ClearControls(Control parent)
{
if ((parent == null) || (!parent.HasChildren))
return;
foreach (var ctl in parent.Controls.OfType<Control>())
{
if (ctl is TextBox txt) {
txt.Clear();
}
if (ctl is CheckBox chk) {
chk.Checked = false;
}
else {
if (ctl.HasChildren) {
ClearControls(ctl);
}
}
}
}
答案 1 :(得分:1)
如果要清除TextBox
内的ComboBox
和panel1
,则只需要遍历panel1
的控件即可。要处理任何面板,您只需编写一个ClearPanel(Panel)
函数。
private void ClearPanel(Panel panel)
{
foreach (var ctrl in panel.Controls)
{
if (ctrl is TextBox tb)
{
tb.Clear();
}
else if (ctrl is CheckBox chkBx)
{
chkBx.Checked = false;
}
}
}
private void ClearPanel1Button_Click(object sender, EventArgs e)
{
ClearPanel(panel1);
}
如果已经引用了要处理的tabControl1
,则对tabPage1
,Panel
等中的控件进行迭代会增加不必要的开销。此外,如果外部循环中的任何控件具有空的Controls
集合,则内部循环将不会执行。我怀疑这可能是您的代码无法正常工作的原因。
请注意,上述解决方案将不会处理TextBox
内另一个容器内的任何ComboBox
或panel1
。因此,如果panel1
内有一个GroupBox
包含TextBox
或ComboBox
es,则不会清除它们。请参阅下面的递归解决方案来解决这种情况。
编辑:重新阅读您的问题后,我想您可能希望清除TextBox
上的所有CheckBox
和Form
控件。
如果您需要清除TextBox
上的每个CheckBox
或Form
,则可以递归进行。
private void Clear(Control ctrl)
{
if (ctrl is TextBox tb)
{
tb.Clear();
}
if (ctrl is CheckBox chkBx)
{
chkBx.Checked = false;
}
foreach (Control child in ctrl.Controls)
{
Clear(child);
}
}
private void ClearButton_Click(object sender, EventArgs e)
{
Clear(this);
}
您可以将任何Control
传递给Clear(Control)
,因此,如果您只想在TextBox
上进行ComboBox
和tabPage1
es,则可以致电{ {1}}。这将清除Clear(tabPage1)
上的所有TextBox
和ComboBox
,即使它们位于tabPage1
或Panel
或其他容器中。>