2013-02-22 35 views
0

所以我有對的SelectedIndexChanged事件處理程序的組合框:編程方式更改組合框選擇,而不會導致的SelectedIndexChanged火災

Private Sub cmbStatus_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbStatus.SelectedIndexChanged 
     DoAnnoyingStuff() 
     '.... 
    End sub 

別處在我的形式,我有做這樣的功能(後一些用戶交互) :

Sub RefreshStatus() 
    Dim sel As Int32 = GetNewStatus() 
    cmbStatus.SelectedIndex = sel '<-- fires a SelectedIndexChanged event that I don't need 
End Sub 

我想在RefreshStatus做的()有什麼改變在組合框中顯示的選擇,但不執行DoAnnoyingStuff()。我該怎麼做呢?

回答

1

您可以手動管理事件,啓用和使用禁用的處理程序:

AddHandler cmbStatus.SelectedIndexChanged, AddressOf cmbStatus_SelIndexChg 
RemoveHandler cmbStatus.SelectedIndexChanged, AddressOf cmbStatus_SelIndexChg  

正如所說,你可以使用一個標誌:

Dim bRefreshStatus As Boolean = False 

Private Sub cmbStatus_SelIndexChg(sender As Object, e As EventArgs) Handles cmbStatus.SelectedIndexChanged 
    If Not bRefreshStatus Then DoAnnoyingStuff() 
End Sub 

Sub RefreshStatus() 
    Dim sel As Int32 = GetNewStatus() 
    bRefreshStatus = True 
    cmbStatus.SelectedIndex = sel 
    bRefreshStatus = False 
End Sub 
+0

接受爲AddHandler/RemoveHandler。很好學習新的東西:) – 2013-02-22 17:10:06

1

添加旗子。所以你會有一個名爲_inChange的私人類字段作爲布爾值,然後在RefreshStatus開始時將該字段設置爲true,最後將該字段設置爲false。在cmbStatus_SelectedIndexChanged中檢查_inChange是否爲真。如果是你只是退出。如果錯誤,則繼續並執行AnnoyingStuff。

+0

也是一個很好的解決方案,但我更喜歡的AddHandler/RemoveHandler,因爲我不需要爲該事件維護一個額外的變量。雖然謝謝! – 2013-02-22 17:11:57

相關問題