对两个不同的事件使用相同的方法吗?

时间:2015-05-23 15:25:31

标签: vb.net

所以基本上我有三个包含项目的列表框。我希望这些项目是可删除的,所以为此我得到了一个只有一个项目的ContextMenuStrip:删除。虽然,我也希望通过按Delete键来删除项目。所以我得到了我的代码,你可以在这里看到:

    Dim TempList As New List(Of String)
    For Each Trigger In ListBoxTriggers.SelectedItems
        TempList.Add(Trigger)
    Next
    For Each Trigger In TempList
        ListBoxTriggers.Items.Remove(Trigger)
    Next

它有点长,因为有数据相关的东西,但现在这是有关从ListBox中删除的部分。现在,为此,我一直在使用

Private Sub ToolStripMenuItemTriggers_Click(sender As Object, e As EventArgs) Handles SupprimerToolStripMenuItemTriggers.Click

(supprimer表示用法语删除)。但问题是我想处理

Private Sub ListBoxDescription_KeyDown(sender As Object, e As KeyEventArgs) Handles ListBoxDescription.KeyDown

用同样的方法。但我不能,因为e不是同一类型...我当然可以在两个处理程序中复制相同的代码,但这并不是真的......干净。我也可以创建另一种方法,我会在

这两个方面调用
Private Sub ListBoxDescription_KeyDown(sender As Object, e As KeyEventArgs) Handles ListBoxDescription.KeyDown
    Delete()
End Sub

Private Sub ToolStripMenuItemTriggers_Click(sender As Object, e As EventArgs) Handles SupprimerToolStripMenuItemTriggers.Click
    Delete()
End Sub

但我也不喜欢它......看起来不是最有效的解决方案......

我能为此做点什么吗?

提前谢谢

2 个答案:

答案 0 :(得分:3)

KeyEventArgs派生自EventArgs,因此您可以声明

Private Sub ListBoxDescription_KeyDown(sender As Object, e As EventArgs) Handles ListBoxDescription.KeyDown

如果您确实需要e作为KeyEventArgs,那么您可以使用

Dim kea = DirectCast(e, KeyEventArgs)

此外,如果您的删除方法具有类似

的签名
Sub DeleteThings(sender As Object, e As EventArgs)

然后你可以做

AddHandler ListBoxDescription.KeyDown, AddressOf DeleteThings
AddHandler ToolStripButton1.Click, AddressOf DeleteThings

请注意,使用AddHandler时不需要Handles子句。

答案 1 :(得分:3)

您必须编写与此类似的公共事件处理程序:

Private Sub CommonEventHandler(sender As Object, e As EventArgs) _
        Handles ToolStripMenuItemTriggers.Click, ListBoxDescription.KeyDown
    If sender Is ListBoxDescription Then
        Dim kea = DirectCast(e, KeyEventArgs)
        If kea.KeyData <> Keys.F2 Then Exit Sub
    End If
    '' Common code
    ''...
End Sub

工作正常,很难赢得优雅点。您也可以将Common code移动到单独的私有方法中。通常的建议是在某一天将任何人维护你的代码视为一个知道你住在哪里的杀人狂。