2013-03-19 62 views
1

我有我從下面編程創建CheckedListBox控制...當我動態創建的項目如何在動態創建的winform控件上引發動態創建的事件?

Button btnSelectAll = new Button(); 
btnSelectAll.Text = "Select All"; 
btnSelectAll.Name = item.Id; 
btnSelectAll.Tag = param.Id; 
CheckedListBox chkListBox = new CheckedListBox(); 
chkListBox.Size = new System.Drawing.Size(flowPanel.Size.Width - lblListBox.Size.Width - 10, 100); 
//set the name and tag for downstream event handling since two-way bindings are not possible with control 
chkListBox.Tag = param.Id; 
chkListBox.Name = item.Id; 
chkListBox.ItemCheck += new ItemCheckEventHandler(chkListBox_ItemCheck); 
btnSelectAll.Click += new EventHandler(btnSelectAll_Click); 

注意,我還添加了一個事件處理程序,只要在chkListBox的ItemCheck被擊中。在代碼中的其他地方...我做...

CheckedListBox tmpCheckedListBox = cntrl as CheckedListBox; 
for (int i = 0; i < tmpCheckedListBox.Items.Count; i++) 
{ 
    tmpCheckedListBox.SetItemChecked(i, true); 
} 

當我這樣做,它doens't提高ItemChecked事件。我該如何提高此事件,使其彷彿用戶點擊了該項目?

+0

沒有,調用SetItemChecked()絕對引發ItemChecked事件。有些東西是看不見的。 – 2013-03-19 22:39:23

回答

2

一種方法是隻是調用相同的方法分配給事件,並通過在正確的控制發送,例如:

for (int i = 0; i < tmpCheckedListBox.Items.Count; i++) 
{ 
    tmpCheckedListBox.SetItemChecked(i, true); 
    chkListBox_ItemCheck(tmpCheckedListBox.Items[i],null); 
} 

,通常可以用傳球EventArgs.Emptynull作爲事件脫身參數,但是如果你在事件處理程序依賴於他們,你就需要構建正確的參數類,並把它傳遞,例如:

for (int i = 0; i < tmpCheckedListBox.Items.Count; i++) 
{ 
    var args = new ItemCheckEventArgs(i,true,tmpCheckedListBox.GetItemChecked(i)); 

    tmpCheckedListBox.SetItemChecked(i, true); 
    chkListBox_ItemCheck(tmpCheckedListBox.Items[i],args); 
} 
+0

+1爲一個很好的答案...並推動你超過10K。大聲笑 – 2013-03-19 22:37:16

+0

感謝您的答案。這工作,但根據您的建議調試後,我發現問題是別的。原始的SetItemChecked方法實際上本身會引發事件。 – Magnum 2013-03-19 22:39:18

+0

@Grant謝謝,我正在搖晃一會兒。 – Lloyd 2013-03-19 22:40:54