2014-12-21 15 views
0

我在C#(Visual Studio Winform)中製作了一個簡單的tic tac toe遊戲。我添加了一個菜單條,其中包含一個文件菜單,其中有一個「新遊戲」選項。我想要做的是重置所有按鈕的文本,我已禁用它們,所以我想再次啓用它們。當我只有菜單欄和我的表單上的按鈕時,我使用了下面的代碼,它工作。但是現在我在表單中添加了一個標籤,並且此代碼不起作用。我知道我可以簡單地爲每個按鈕重新設置一個值,但是我想知道添加標籤時出了什麼問題。提前致謝。 :)使用foreach重置每個按鈕的文本和啓用值

try 
    { 
     foreach (Control c in Controls) 
     { 
      Button b = (Button)c; 
      b.Text = ""; 
      b.Enabled = true; 
     } 
    } 
    catch { } 
+0

燕子異常。在StackOverflow上找到什麼是錯誤...希望有幫助的提示:在Visual Studio下的調試菜單,然後例外,你可以告訴VS拋出異常時拋出*即使處理/吞下*。即使只是臨時移除try/catch也可以達到同樣的效果。要麼有可能已經揭示了錯誤的原因,並且會比別人告訴你這個問題更令人滿意和受教育。 –

回答

2

您的代碼不工作了,因爲Controls集合,現在還包含了標籤,所以當你的循環到達Label控件,它拋出一個異常,在這條線

Button b = (Button)c; 

你不能將一個標籤轉換成一個按鈕,但這個異常被空的try catch所吞噬,並且你的循環終止而沒有任何警告。有空嘗試/捕獲被認爲是一種不好的做法,最好刪除它們並讓異常顯示出來。

使用OfType枚舉擴展名可以避免您的問題,只能獲取Button類型的控件。現在您的其他代碼不需要任何其他更改。

foreach (Button b in Controls.OfType<Button>()) 
{ 
    b.Text = ""; 
    b.Enabled = true; 
} 

但請記住,此循環在窗體控件容器上工作。如果添加一些其他類型的容器(如GroupBox或Panel)並在該控件內移動按鈕,則需要在該容器的Controls屬性上循環。

編輯
要排除從環中特定按鈕,你可以調用IEnumerable<T>.Where添加到由OfType返回。例如

foreach (Button b in Controls.OfType<Button>().Where(x => x.Name != "button10") 
..... 
+0

非常感謝您的幫助!我想知道如果我想選擇除一個之外的所有按鈕,我該怎麼做?至於在「foreach(Controls.OfType

+0

答案更新假設你想排除一個按鈕,其名稱是「button10」 – Steve

+0

感謝一羣! :) – Ali

2
this.Controls.OfType<Button>().ToList().ForEach(b => { b.Text = ""; b.Enabled = true; });