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

时间:2014-03-13 16:39:37

标签: c# visual-studio-2010 tabs

我正在尝试创建一个清除/重置用户输入的按钮,然后返回到表单的开头。

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

 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;
            }
    }

我正在努力保持尽可能简单,因为我是编程和学习的新手。我已经解决了这个问题很长一段时间了。如果有人能够提供一个更简单的方法来举例说明或者在我自己的代码中指出一些错误,例如。 “为什么它不会切换回上一个标签并清除”那将是很棒的。

感谢。

4 个答案:

答案 0 :(得分:1)

将您当前的foreach替换为:

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

答案 1 :(得分:0)

我认为您需要更改循环以包含所有选项卡,而不仅仅是选定的选项卡:

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

答案 2 :(得分:0)

在你的第二个代码示例中,看起来你正在使用i进行循环,然后根本不对变量做任何事情。

现在请记住我的建议可能并不准确 - 我有一段时间没有使用winforms - 但你真正想做的是使用嵌套for-each循环,如果它们在表单上工作他们似乎是你的第一个例子。 LewisT的回答为您提供了一个大致的想法。

确保在外部for-each循环的闭合块之后将“active”选项卡设置为第一个。

最后 - 这是一个“面向对象的原则”,而不是你的问题的答案 - 我会把这个方法提取到这个按钮的click事件调用这个方法而不是在其中做所有事情的地方。考虑您可能希望在此表单的其他选项卡中使用“全部清除”按钮,或者甚至使用不同的选项卡表单。您可以在事件处理程序中调用方法一次,而不是复制和粘贴这些丑陋的for循环和if语句。

它会让您的代码更具可读性,并且您可以比应用程序的功能更强大。

答案 3 :(得分:0)

似乎我在20分钟后得到答案,但如果你真的想清除/重置所有内容,你也应该清除ComboBox吗?

解决方案是使用另一个更高层来循环使用foreach,因此我们尝试找出 TabPage tabControl1 之间的关系。我尝试将var声明为tab,但tab将变为对象类型,之后无法处理tab.Controls

因此,我查看TabControl.TabPageCollection Class并点击其说明中的TabPage链接。我从TabPage Class的继承层次结构中获取System.Windows.Forms.TabPage。 (我试图告诉你我是如何得到正确的课程的)

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();
            }
        }
    }
}

顺便说一句,我建议将清除所有按钮从TabControl中取出并将其放在Form 中的某个位置,以便通常可以看到清除所有按钮,点击甚至你不在第四个标签?