-1
我在WinForms C#中。我正在將點擊委託給一個函數。Undelegate事件循環
foreach (Class.Item item in _searchName)
{
indexGroup++;
if (indexGroup <= MAX_SEARCHES)
{
myCntrl = (GSSearcher)panelSearch.Controls["gsSearcher" + indexGroup.ToString()];
myCntrl.Visible = true;
myCntrl.SetId = item.Id;
myCntrl.SetText1 = item.Name;
myCntrl.SetText2 = item.Description;
string[] onlyDate = item.DateCreate.ToString().Split(' ');
myCntrl.SetText3 = onlyDate[0].ToString();
//HAY QUE MIRAR ESTO.
myCntrl.MyClick += delegate { ClickIdToLoad(item.Id); };
}
}
這是在搜索器內部,每次有人搜索循環都是重新分配函數。所以當我將一個斷點放到函數ClickIdToLoad時,這會在很多時候停止。我需要「取消」這個功能,或者像這樣的事情已經被授權了。
那麼,每次迭代,您都正在爲該事件訂閱一個新的匿名代理。你可以重寫你的代碼來保存一個引用(並且像這裏所示的那樣刪除http://stackoverflow.com/questions/183367/unsubscribe-anonymous-method-in-c-sharp)或者嘗試將'+ ='移到外面你的循環。 – ChrisK
是否可以將'ìtem.id'保存在[Tag](https://msdn.microsoft.com/de-de/library/system.windows.forms.control.tag(v = vs.110) ).aspx)你的控制?看起來這是一個自定義控件,所以你可以在事件處理程序中查詢'Tag',並調用'ClickIdToLoad((int)item.Id)'。這樣你就不需要保留一堆引用。 – ChrisK
根本不要在循環內部分配MyClick事件處理程序。這沒有意義。在表單類構造函數中分配它,所有這些GSSearcher控件只需要一個事件處理程序。在該事件處理程序中,將* sender *參數強制轉換爲GSSearcher並使用SetId屬性。或者重寫GSSearcher類中的OnClick()方法。 –