如何清除嵌套在tabControl,tabPage和2个面板中的文本框?

时间:2019-07-18 22:02:01

标签: c# winforms checkbox textbox

下面的图片代表了我正在构建的插件。

黄色 = tabControl1; 橙色 = tabPage1; 蓝色 =主面板(mainPanel); 绿色 =主面板中的3个不同的面板(panel1,panel2和panel3); 白色 =文本框(我要清除); DarkBlue =对应于绿色面板的复选框

plugIn

我尝试清除文本框中的所有文本(如果其中包含文本),并清除复选框(如果通过单击按钮选中)。

我在网上进行了研究,并尝试通过以下方法来实现这一目标,但这似乎并不是解决此问题的正确方法。

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做同样的事情。

我到底在做什么错?任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:2)

您只需要一个简单的递归方法,即可在此处指定的父容器 mainPanel 的所有子容器中迭代所有控件。
如果控件的类型为TextBox或CheckBox,则相应地设置其TextChecked属性:

(请注意,您也可以将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内的ComboBoxpanel1,则只需要遍历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,则对tabPage1Panel等中的控件进行迭代会增加不必要的开销。此外,如果外部循环中的任何控件具有空的Controls集合,则内部循环将不会执行。我怀疑这可能是您的代码无法正常工作的原因。

请注意,上述解决方案将不会处理TextBox内另一个容器内的任何ComboBoxpanel1。因此,如果panel1内有一个GroupBox包含TextBoxComboBox es,则不会清除它们。请参阅下面的递归解决方案来解决这种情况。

编辑:重新阅读您的问题后,我想您可能希望清除TextBox上的所有CheckBoxForm控件。

如果您需要清除TextBox上的每个CheckBoxForm,则可以递归进行。

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上进行ComboBoxtabPage1 es,则可以致电{ {1}}。这将清除Clear(tabPage1)上的所有TextBoxComboBox,即使它们位于tabPage1Panel或其他容器中。