2008-11-13 79 views
7

這似乎是一個非常簡單而且很常見的問題。我能想到的最簡單的例子是:在Windows窗體中暫停控件事件的最佳方法?

表單有五個複選框,上面有一個「全選/無選中」複選框。當用戶選擇檢查所有複選框時,我會切換「子」的狀態 - 顯然,我不想觸發所有孩子的檢查事件,直到完成所有複選框的設置。

我無法找到表單範圍的暫停控制事件。如果我只是想念它,那麼很簡單的答案。除了我只是缺少一個簡單的解決方案,什麼是暫停表單控制事件的最佳方法(最佳實踐?接受解決方案?)?

+0

您使用的是VB .NET還是C#? – 2008-11-13 17:38:07

+0

@Kyralessa:這很重要嗎? – 2008-11-13 17:43:15

回答

4

我已經遇到此之前,通常看到的人做到這一點:

/*SNIP*/ 

private bool isMassUpdate; 

public void Check1_Check(object sender, EventArgs e) 
{ 
    if(!isMassUpdate) 
    { 
     do some stuff 
    } 
} 

/*SNIP*/ 

您還可以拆卸和重新安裝事件處理程序,但是,有人告訴我這可能是內存泄漏的來源。

有關內存泄漏和事件處理程序的信息:它們不直接與連接和分離相關聯,但我們在其中一個應用程序中發現,繼承樹的事件處理程序的錯誤引用可能導致它。

3

從你的其他問題,我會猜測你正在使用VB .NET。所以,RemoveHandler是你最好的選擇。通常在VB中,人們使用Handles子句設置事件處理程序。但你也可以這樣來做:

AddHandler chk1.CheckedChanged, AddressOf DoSomething 

其中DoSomething的可能是這樣的:

Private Sub DoSomething(ByVal sender As Object, ByVal e As EventArgs) 
    ' whatever 
End Sub 

AddHandler的電線了事件,所以它會火。爲了得到它不射擊,使用RemoveHandler:

RemoveHandler chk1.CheckedChanged, AddressOf DoSomething 

之前更新您的孩子複選框的選中屬性,調用RemoveHandler他們每個人的;那麼當你完成後,調用AddHandler把事件處理程序返回。如果您的所有複選框使用相同的處理程序,則可以將它們放入集合中並循環訪問集合以添加或刪除處理程序。

1

你也可以考慮處理 '點擊' 事件的按鈕,而不是入住改變。這可能更接近你的意圖。

0

在我Visual Basic 6.0應用程序,我不得不處理用戶雙擊一切,所以我所有的事件處理程序我有一條線,檢查一個全局變量

Private bSuspendEvents as Boolean 

Private Sub Button1_Click() 

    On Error Goto ErrorHandler 

    If bSuspendEvents then Exit Sub 

    bSuspendEvents = True 

    'Do stuff 

    NormalExit: 
     bSuspendEvents = False 
     Exit Sub 

    ErrorHandler: 
     'Handle Error 
     Resume NormalExit 

End Sub 
4

我在這些情況下做些什麼,而不是具有暫停事件的布爾值,我使用計數器。當計數> 0時,則暫停事件,當計數= 0時,則恢復事件。如果我有多件事情可能要求暫停活動,這有助於解決問題。

另一個有用的事情是,如果我需要暫停塊中的事件,我創建了一個IDisposable的輔助類,可以在「使用」塊中使用(在C#中),所以我不會忘記減少櫃檯一旦我超出範圍。