2016-01-16 23 views
0

我有一種方法將ComboBox作爲參數,然後向其中添加數據。當添加數據時,SelectedIndexChangedEvent觸發。有沒有一種方法,在被調用的方法中,我可以刪除上面的事件處理程序,無論ComboBox作爲參數傳遞,然後添加在方法的末尾?我知道如何刪除和添加特定的處理程序,但不知道如何根據傳遞哪個ComboBox來完成。爲ComboBox作爲參數傳遞的不同ComboBox的移除和添加事件處理程序

這裏的方法..

Private Sub PopulateComboBox(ByRef cboBox As ComboBox, ByVal itemSource As String) 
    'Remove handler for cboBox 
    'Do stuff that would otherwise cause the event handler to execute 
    'Add handler for cboBox 
End Sub 

我有4個組合框 - 這將是更容易去除所有4個事件處理程序,然後再在代碼的末尾添加呢?不過,我想知道這是可能的,這樣我可以有可能在未來

+0

如何使用'cboBox' VAR順利通過不行? – Plutonix

+0

傳遞組合框工作正常。我只需要刪除事件處理程序,無論哪個組合框傳遞,我也需要以某種方式傳遞事件處理程序方法。事件處理方法是每個組合框的不同方法 –

+0

'_SelectedItemChangedEvent'是這個WinForms嗎?你的意思是'SelectedIndexChanged'嗎? – Plutonix

回答

1

最基本的方法去了解這是要做到這一點:

Private Sub PopulateComboBox(ByRef cboBox As ComboBox, ByVal itemSource As String) 
    RemoveHandler cboBox.SelectedIndexChanged, AddressOf ComboBox1_SelectedIndexChanged 
    'Do stuff that would otherwise cause the event handler to execute 
    AddHandler cboBox.SelectedIndexChanged, AddressOf ComboBox1_SelectedIndexChanged 
End Sub 

Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged 

End Sub 

另一種選擇,這可能是在某些情況下更是這樣做:

Private _ignoreComboBox As ComboBox = Nothing 

Private Sub PopulateComboBox(ByRef cboBox As ComboBox, ByVal itemSource As String) 
    _ignoreComboBox = cboBox 
    'Do stuff that would otherwise cause the event handler to execute 
    _ignoreComboBox = Nothing 
End Sub 

Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged 
    If sender Is Not _ignoreComboBox Then 

    End If 
End Sub 

或者,在同一時間處理多個組合框:

Private _ignoreComboBoxes As List(Of ComboBox) = New List(Of ComboBox)() 

Private Sub PopulateComboBox(ByRef cboBox As ComboBox, ByVal itemSource As String) 
    _ignoreComboBoxes.Add(cboBox) 
    'Do stuff that would otherwise cause the event handler to execute 
    _ignoreComboBoxes.Remove(cboBox) 
End Sub 

Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged 
    If Not _ignoreComboBoxes.Contains(DirectCast(sender, ComboBox)) Then 

    End If 
End Sub 
+0

@Plutonix和Enigmativity - 感謝你們兩位非常有幫助的答案 - 我不知道應該選擇哪一個作爲明確的答案。我意識到這可能算作嘮叨,但是你們中的任何一個人都有偏好的答案? –

+0

@DavidWilson - 真的取決於你。 – Enigmativity

1

這裏適用於可重用的代碼是單向的:

' these happen to map to the same event handler 
Private cb1Event As EventHandler = AddressOf cbx_SelectedIndexChanged 
Private cb2Event As EventHandler = AddressOf cbx_SelectedIndexChanged 

然後當用於

PopulateComboBox(cb1, items, cb1Event) 
PopulateComboBox(cb2, items, cb2Event) 
' or 
PopulateComboBox(cb3, items, AddressOf cbx_SelectedIndexChanged) 

的方法將被宣佈爲:

Private Sub PopulateComboBox(cboBox As ComboBox, 
          items As String, ev As EventHandler) 

就個人而言,因爲你知道反正所涉及的CBO,我會做到這一點之前,撥打:

RemoveHandler cb1.SelectedIndexChanged, AddressOf cbx_SelectedIndexChanged 
PopulateComboBox(cb1, items) 
AddHandler cb1.SelectedIndexChanged, AddressOf cbx_SelectedIndexChanged 

沒有多少通過了所有的信息做一些別的東西,因此它可以做你知道需要做的事情來獲得。

+0

@DavidWilson FYI你不會被'@ xxx'釘住,除非你對該帖子有評論。最好/首選取決於情況。在這種情況下,布爾忽略標誌會更簡單 - 這不是你要求的。如果控件具有某種依賴性 - 更改cb1對cb2執行某些操作 - 則可以使bool「更智能」,以便方法3不會過早撤消方法1的設置。 – Plutonix

+0

感謝您的幫助,但Enigmativity的最後解決方案更適合我,因爲我認爲我會更容易將其納入其他計劃。 –

相關問題