2014-03-13 32 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上工作奇怪,哈哈 –