2014-07-03 86 views
0

我有一個10×10的正方形100個按鈕,他們改變顏色時單擊。試圖做一個按鈕,將重置所有其他按鈕背景顏色

 private void alternateColor(Control ctrl) 
    { 
     switch (ctrl.BackColor.Name) 
     { 
      case "LightGray": 
       ctrl.BackColor = Color.LightBlue; 
       break; 
      default: 
       ctrl.BackColor = Color.LightGray; 
       break; 
     } 
    } 
    private void matrixButtonClick(object sender, MouseEventArgs e) 
    { 
     alternateColor(sender as Control);    
    } 

我想要一個按鈕,將每個已更改爲lightblue的按鈕重置爲lightgray。任何幫助,將不勝感激

private void btnClear_Click(object sender, EventArgs e) 
    { 
     ???? 
    } 
+0

哪個部位有問題?找到按鈕? –

+1

順便說一句,爲什麼當你只能檢查'ctrl.BackColor'時,你檢查'ctrl.BackColor.Name'。這是'case Color.LightGray:'... –

+0

順便說一句,你可以這樣寫'alternateColor':'private void alternateColor(Control ctrl){ctrl.BackColor = ctrl.BackColor == Color.LightGray? Color.LightBlue:Color.LightGray; }' – Enigmativity

回答

0

您可以使用linq過濾具有特定背色的按鈕。您可以使用Enumerable.OfType獲得按鈕式的控制和使用Enumerable.Where方法來篩選與背景色名稱等於按鈕LightBlue

//Get the button in form with LightBlue back color. 
var formLightBlueButton = form1.Controls.OfType<Button>() 
         .Where(b=>b.BackColor == Color.LightBlue); 

//Changing the color of buttons 
foreach(var button in formLightBlueButton) 
     button.BackColor = Color.LightGray; 

編輯使用foreach循環來獲取和設置按鈕屬性,而不是使用LINQ的似乎更這裏適當的。只需使用is運算符來過濾按鈕並更改背景顏色。

foreach(Control ctrl in this.Controls) 
    if (ctrl is Button && ctrl.BackColor == Color.Maroon) 
     ctrl.BackColor = Color.LightGray; 
+0

你並不需要過濾按鈕 - 它們會得到所有相同的顏色 - 只是說 – Carsten

+0

只是爲了確保它不應該得到不滿足條件的按鈕,即Color.LightBlue – Adil

+0

感謝foreach循環完美工作。 – user3513239

0

我能想到的幾種方法:

  1. 迭代通過在conatainer孩子,挑選每一個按鈕並設置它的顏色改回
  2. 使用事件/的IObservable你認購上創建每個按鈕和,通過使用模型(MVVM)
012通知改變後的顏色的按鈕
  • 2提高

    的列表是按難度排序,但後來者給你更好的設計,並根據您的問題,我會建議至少2

    PS:我不能給你有意義的代碼,而無需有點頭緒的你是什麼真正的在那裏做 - 如果我能看到更多的代碼/定義,我會添加一些。