如何清除嵌套在 TabControl、TabPage 和 2 个面板中的文本框?

Posted

技术标签:

【中文标题】如何清除嵌套在 TabControl、TabPage 和 2 个面板中的文本框?【英文标题】:How to clear TextBoxes nested inside a TabControl, TabPage and 2 Panels? 【发布时间】:2019-11-27 21:35:09 【问题描述】:

下图是我正在构建的一个插件。

黄色 = tabControl1; 橙色 = tabPage1; 蓝色 = 主面板(mainPanel); 绿色 = 主面板内的 3 个不同面板(面板 1、面板 2 和面板 3); White = 文本框(我想清除); 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,但尝试对panel2 和3 做同样的事情。

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

【问题讨论】:

【参考方案1】:

您只需要一个简单的递归方法来迭代指定父容器的所有子容器内的所有控件,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);
            
        
    

【讨论】:

【参考方案2】:

如果您想清除panel1 内部的TextBoxes 和ComboBoxes,那么您只需要循环通过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);

如果您已经引用了正在处理的Panel,则遍历tabControl1tabPage1 等中的控件会增加不必要的开销。更重要的是,如果外部循环中的任何控件有一个空的Controls 集合,那么内部循环将不会执行。我怀疑这可能是您的代码无法正常工作的原因。

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

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

如果您需要清除Form 上的每个TextBoxCheckBox,您可以使用递归来完成。

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),因此如果您只想在tabPage1 上执行TextBoxes 和ComboBoxes,您可以调用Clear(tabPage1)。这将清除tabPage1 上的所有TextBoxes 和ComboBoxes,即使它们位于PanelGroupBox 或其他容器中。

【讨论】:

以上是关于如何清除嵌套在 TabControl、TabPage 和 2 个面板中的文本框?的主要内容,如果未能解决你的问题,请参考以下文章

在Fragment中嵌套使用viewpagerindicator切换Fragment返回后出现空白页与FragmentPagerAdapter页面预加载的解决方案

如何从 TabControl 隐藏 TabPage [重复]

如何在tabcontrol中使标签页无法访问

如何在 SelectedIndexChanged 事件之前检测 TabControl 中标签页的更改?

如何在没有单击事件的情况下使特定的 TabItem 获得对 TabControl 的关注?

VS2005中menustrip控件如何实现tabcontrol功能?