2015-11-02 26 views
1

我試圖根據用戶輸入的數據在面板上動態創建複選框。如果其中任何一項被選中,我想在面板外部檢查一個不同的複選框。看起來是這樣的:將所有動態創建的複選框連接到同一個事件處理程序

[]所有


[] Specific1 [] Specific2 [] Specific3

這是我創建的複選框:

 foreach (Camera cam in UserData.globalUserData.cameras) 
     { 
      box = new CheckBox(); 
      box.Text = cam.Nickname; 

      box.AutoSize = true; 
      box.CheckedChanged += new EventHandler(CheckedChanged); 

      pnlCamTicky.Controls.Add(box); 
     } 

我的事件:

private void CheckedChanged(object sender, EventArgs e) 
    { 
     foreach (Control c in pnlCamTicky.Controls) 
     { 
      if (c is CheckBox) 
      { 
       if (((CheckBox)c).Checked) 
       { 
        chkAllCameras.Checked = false; 
       } 
       else 
       { 
        chkAllCameras.Checked = true; 
       } 
      } 
     } 

    } 

但是,這隻適用於窗體上動態創建的LAST複選框。我認爲在創建新的複選框時,事件處理程序的接線正在被覆蓋。

如何動態創建複選框,然後將它們全部連接到相同的事件處理程序?

+0

您使用始終相同_chkAllCamers_ checkbutton。您應該在該循環中使用變量_c_ – Steve

+0

循環中的最後一個複選框總是以該邏輯獲勝。 – LarsTech

+0

是的,chkAllCameras不是被循環使用的控件之一。它需要根據是否檢查任何正在循環的控件進行更改。 我覺得它的作品,如果我從事件處理程序中刪除「else」語句,因爲我是一個笨蛋。 所以我需要單獨的邏輯,如果NONE的複選框被選中。 謝謝。 –

回答

0

嘗試使用變量,而不是:

bool somethingChecked = false; 
foreach (CheckBox cb in pnlCamTicky.Controls.OfType<CheckBox>()) { 
    if (cb.Checked) { 
    somethingChecked = true; 
    } 
} 
chkAllCameras.Checked = somethingChecked; 
0

「else」聲明導致問題。如果刪除了它,它將起作用,但如果勾選了NONE的複選框,則需要單獨的邏輯。

0

由於看中了一個班輪:

chkAllCameras.Checked = pnlCamTicky.Controls.OfType<CheckBox>().All(c => c.Checked); 
+0

如果您希望在任何*複選框被選中的情況下將其替換爲'All()',則替換'All()',但我會建議在這種情況下使用不同的名稱。選中一個框並不意味着你檢查了全部。 – Blindy

相關問題