2017-10-04 89 views
0

我有以下代碼,它處理12複選框上的CheckedChanged -event。C#開關箱複選框

private void cbJournal_CheckedChanged(object sender, RoutedEventArgs e) 
{ 
    CheckBox chk = (CheckBox)sender; 

    if (chk.IsChecked == true) 
    { 

     switch (chk.Name) 
     { 
      case "cbErbbstg": 
      { 
       month = Months[idxMonth]; 
       LinkToRSS.Add(link + month); 
       RSSname.Add(name); 
       Picture.Add(picture); 
       ID.Add(100); 

      } 
      break; 

      case "cbGstb": 
      { 
       month = Months[idxMonth]; 
       LinkToRSS.Add(link + month); 
       RSSname.Add(name); 
       Picture.Add(picture); 
       ID.Add(200); 
      } 
      break; 
     } 
} 

現在我想要實現一個複選框,如果選中此複選框,也會檢查其他每個複選框,並將所有元素添加到列表中。

也就是說,我想以某種方式遍歷所有情況,因此每個列表都可以用值填充。

編輯: 只是:增值(名稱,鏈接等)是不同的每個複選框。

有什麼建議嗎?

+0

創建一個字典,其中每個關鍵要素是複選框的名字的方法想要執行該複選框。現在您不需要再切換,您可以簡單地調用該複選框的預期方法。 – Steve

+0

聽起來這個複選框會有自己的處理程序方法,它只是將所有的值添加到列表中。並設置其他複選框進行檢查。你有沒有嘗試寫另一個處理程序? – David

+0

嗨,我並不完全知道你想要做什麼,但是如果我找到了你的話,你可以定義一個複選框列表 列表 checkBoxes; 並使用它遍歷所有的框,標記爲支票,當然用列表中的項目作爲發件人調用處理程序。 您需要初始化您的列表以及所有對這些框的引用並執行類似操作。 foreach(var checkBox in checkboxes) { 複選框。Checked = true; cbJournal_CheckedChanged(checkBox,null); } –

回答

3

你可以從Form.Controls收集所有的複選框的列表:

List<CheckBox> chbList = this.Controls.OfType<CheckBox>().ToList(); 

現在遍歷列表和Checked屬性設置爲true。這樣所有CheckedChanged事件將被解僱。

foreach (var chb in chbList) 
{ 
    chb.Checked = true; 
} 

,如果你讓他們掛在同一個事件處理程序可以調用也直接的方法:

foreach (var chb in chbList) 
{ 
    cbJournal_CheckedChanged(chb, new RoutedEventArgs()); 
} 

編輯:

如果你使用WPF AER你需要的家長控制複選框。它在我的例子中,窗口有一個Grid這是複選框的父:

Grid myGrid = this.Content as Grid; 

List<CheckBox> chbList = myGrid.Children.OfType<CheckBox>().ToList(); 

在WPF謹防屬性被稱爲IsChecked

foreach (var chb in chbList) 
{ 
    chb.IsChecked = true; 
} 
+0

這種方法似乎正是我所需要/想要的,謝謝!雖然,我在'this.Controls'上遇到編譯器錯誤。我添加了使用指令和引用,但它仍然無法識別它(我正在使用WPF,而不是表單,順便說一句)。我該如何解決這個問題? – Allix

+0

@Allix如果你使用WPF你應該檢查出這個答案(https://stackoverflow.com/a/978352/5174469) –

+0

有沒有簡單的方法來添加現有的複選框到List()和然後只是迭代? – Allix

1

一個可能的解決方案是創建一個字典,其中每個鍵元素是複選框的名稱,而值是您要爲該複選框執行的操作。

現在,而值是你的行動,你不再需要切開關,你可以簡單地調用預期該複選框

// Declare this at the class global level 
Dictionary<string, Action> checkExecuter = new Dictionary<string, Action>(); 

// Initialize it somewhere at the start of your class lifetime 
checkExecuter.Add("cbErbbstg", OnCbErbbstgChecked); 
// add other methods here 
checkExecuter.Add("cbAllBox", OnAllBox); 

// Action to execute when the cbErbbstg is checked 
void OnCbErbbstgChecked() 
{ 
    month = Months[idxMonth]; 
    LinkToRSS.Add(link + month); 
    RSSname.Add(name); 
    Picture.Add(picture); 
    ID.Add(100); 
} 

// Action to execute when the cbAllBox is checked 
void onAllBox() 
{ 
    foreach(KeyValuePair<string, Action> kvp in checkExecuter) 
    { 
     if(kvp.Key != "cbAllBox") 
      kvp.Value.Invoke(); 
    } 
} 

private void cbJournal_CheckedChanged(object sender, RoutedEventArgs e) 
{ 
    CheckBox chk = (CheckBox)sender; 
    if (chk.IsChecked && checkExecuter.ContainsKey(chk.Name)) 
    { 
     checkExecuter[chk.Name].Invoke(); 
    } 
}