2016-09-29 104 views
-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時,這會在很多時候停止。我需要「取消」這個功能,或者像這樣的事情已經被授權了。

+0

那麼,每次迭代,您都正在爲該事件訂閱一個新的匿名代理。你可以重寫你的代碼來保存一個引用(並且像這裏所示的那樣刪除http://stackoverflow.com/questions/183367/unsubscribe-anonymous-method-in-c-sharp)或者嘗試將'+ ='移到外面你的循環。 – ChrisK

+0

是否可以將'ì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

+0

根本不要在循環內部分配MyClick事件處理程序。這沒有意義。在表單類構造函數中分配它,所有這些GSSearcher控件只需要一個事件處理程序。在該事件處理程序中,將* sender *參數強制轉換爲GSSearcher並使用SetId屬性。或者重寫GSSearcher類中的OnClick()方法。 –

回答

0

感謝作者chrisk我用這個解決方案:

是否可以保存ìtem.id在控制的標籤?看起來這是一個自定義控件,所以你可以在事件處理程序中查詢標籤,並調用ClickIdToLoad((int)item.Id)。這樣你就不需要保留一堆引用。 - ChrisK 1小時前

但是我不是「unleggating」。

謝謝ChrisK!