2014-03-13 26 views
1

我想创建一个按钮,清除/重置用户输入,然后返回到窗体的开始。清除/重新设置标签内的用户输入。 C#

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

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个背透到第一片的同时清除/正在重置的过程中的一切。

我以为我可以通过创建一个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; 
      } 
    } 

我努力让它尽可能简单,就像编程和仍在学习的新手一样。我一直在解决这个问题。如果有人能为我提供一个更简单的方法来做到这一点,或指出我自己的代码中的一些错误,例如。 “为什么它不会切换回前一个选项卡并清除”那将会很棒。

谢谢。

回答

1

喜欢的东西替换当前的foreach

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

谢谢,我得到它的工作。 – ArcturusIV

0

我认为你需要改变你的循环包括所有的标签,而不是仅仅所选标签:

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

在你的第二个代码示例,它看起来像你使用我得到一个循环,然后根本就没有做任何变量。

现在请记住我可能会暗示的内容可能不准确 - 我在一段时间内没有使用过winforms - 但是您真正想要做的是使用嵌套for-each循环,如果他们在表单上工作他们似乎为你的第一个例子的方式。刘易斯的答案给了你一个大概的想法。

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

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

它会使你的代码更具可读性,并且你将拥有更多的权力来处理你的应用程序可以做的事情。

0

看起来像我得到我的答案晚20分钟,但如果你真的想清除/重置一切,你应该清除组合框?

该解决方案具有其他高层与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,并把它某处表格让清即使你不在第4个标签中,所有按钮通常都可以看到并点击?

+0

感谢您的帮助,并发现了ComboBox的错误。 – ArcturusIV

+0

我发现这个错误,因为我试图构建一个相同的检查我的代码功能,它在ComboBox上工作奇怪,哈哈 –