清除/重置选项卡中的用户输入。C#

清除/重置选项卡中的用户输入。C#,c#,visual-studio-2010,tabs,C#,Visual Studio 2010,Tabs,我试图创建一个按钮,用于清除/重置用户输入,然后返回表单的开头 我的表格有四个标签。“全部清除”按钮位于第四个选项卡上 private void cmdClearAll_Click(object sender, EventArgs e) { foreach (Control ctrl in tabControl1.SelectedTab.Controls) { if (ctrl is TextBox)

我试图创建一个按钮,用于清除/重置用户输入,然后返回表单的开头

我的表格有四个标签。“全部清除”按钮位于第四个选项卡上

 private void cmdClearAll_Click(object sender, EventArgs e)
    {
      foreach (Control ctrl in tabControl1.SelectedTab.Controls) 
            {
                if (ctrl is TextBox)
                {
                    (ctrl as TextBox).Text = string.Empty;
                }

                if (ctrl is Label)
                {
                    (ctrl as Label).Text = string.Empty;
                }

                if (ctrl is ListBox)
                {
                    (ctrl as ListBox).Items.Clear();

                }

                if (ctrl is ComboBox)
                {
                    (ctrl as ComboBox).SelectedIndex = -1;
                }

          }
  }
上面的代码只在最后一个选项卡上起作用,我试图实现的是在清除/重置过程中的所有内容时,从第4个选项卡循环到第1个选项卡

我想我可以通过创建一个for循环并在其内部添加foreach来实现这一点,但有些地方出了问题

    for (int i = 3; i <= tabControl1.SelectedIndex; i--)
    {
    foreach (Control ctrl in tabControl1.SelectedTab.Controls) 
        {
            if (ctrl is TextBox)
            {
                (ctrl as TextBox).Text = string.Empty;
            }

            if (ctrl is Label)
            {
                (ctrl as Label).Text = string.Empty;
            }

            if (ctrl is ListBox)
            {
                (ctrl as ListBox).Items.Clear();

            }

            if (ctrl is ComboBox)
            {
                (ctrl as ComboBox).SelectedIndex = -1;
            }
    }

for(int i=3;i我认为您需要更改循环以包括所有选项卡,而不仅仅是所选选项卡:

foreach (var tab in tabControl1.TabPages)
{ 
    foreach( Control ctrl in ((TabPage)tab).Controls)
    {
// your code
    }
}

将当前的
foreach
替换为以下内容:

foreach(TabPage tab in tabControl1.TabPages)
{
    foreach(Control ctl in tab.Controls)
    {
        // your "if" statements here...                    
    }
}

在您的第二个代码示例中,看起来您正在使用i获得一个循环,然后根本不使用变量执行任何操作

现在请记住,我的建议可能并不准确——我已经有一段时间没有使用winforms了——但是如果每个循环都像第一个示例中那样使用表单,那么您真正想要做的是为每个循环使用嵌套

确保将“活动”选项卡设置为每个回路外部闭合块后的第一个选项卡

最后,这是一个“面向对象的原则”,而不是对你的问题的回答——我会把这个方法提取到这个按钮的点击事件调用这个方法,而不是做它里面的每件事。考虑你可能想要一个“清除所有”的可能性。此窗体的其他选项卡中的按钮,甚至是其他选项卡形式中的按钮。与复制和粘贴这些for循环和if语句不同,您只需在事件处理程序中调用该方法一次


这将使您的代码更具可读性,您的应用程序的功能也会更强大。

我似乎晚了20分钟才得到答案,但如果您真的想清除/重置所有内容,您也应该清除组合框?

解决方案是使用另一个更高的层与foreach循环,因此我们试图找出TabPagetabControl1之间的关系。我试图使用
var
声明
选项卡
,但是
选项卡
将成为对象类型,并且无法处理
选项卡控件
稍后

因此,我检查并单击其说明中的TabPage链接。我从的继承层次结构中获得
System.Windows.Forms.TabPage
。(我试图向您展示如何获得正确的类)


顺便说一句,我建议将“全部清除”按钮从选项卡控件中取出,并将其放在表单中的某个位置,这样即使您不在第四个选项卡中,也可以看到并单击“全部清除”按钮?

谢谢您的帮助,并在组合框中发现了错误。我发现了错误,因为我试图构建一个相同的按钮检查我的代码功能,它在ComboBox上运行的很奇怪,哈哈
private void cmdClearAll_Click(object sender, EventArgs e)
{
    //loop in TabPages collection in tabControl1
    foreach (System.Windows.Forms.TabPage tab in tabControl1.TabPages)
    {
        //loop in all controls in looping TabPage
        foreach (Control ctrl in tab.Controls)
        {
            if (ctrl is TextBox)
            {
                (ctrl as TextBox).Text = string.Empty;
            }

            if (ctrl is Label)
            {
                (ctrl as Label).Text = string.Empty;
            }

            if (ctrl is ListBox)
            {
                (ctrl as ListBox).Items.Clear();
            }

            if (ctrl is ComboBox)
            {
                //(ctrl as ComboBox).SelectedIndex = -1;
                (ctrl as ComboBox).Items.Clear();
            }
        }
    }
}