Vb.net 使用快捷键时如何引发事件
我在VB.Net中有一个名为vpsGridView的UserControl,它有一个MenuStrip名称工具栏和一个名为dtgvpsGV的Datagridview。My MenuStrip有两个ToolStripMenu,tsAddRow和tsDeleteRow分别带有(Ctrl+Ins)快捷键和(Ctrl+Del)快捷键 这是我的密码:Vb.net 使用快捷键时如何引发事件,vb.net,datagridview,user-controls,Vb.net,Datagridview,User Controls,我在VB.Net中有一个名为vpsGridView的UserControl,它有一个MenuStrip名称工具栏和一个名为dtgvpsGV的Datagridview。My MenuStrip有两个ToolStripMenu,tsAddRow和tsDeleteRow分别带有(Ctrl+Ins)快捷键和(Ctrl+Del)快捷键 这是我的密码: Public Event vps_ItemClick(ByVal sender As Object, ByVal e As System.EventArgs
Public Event vps_ItemClick(ByVal sender As Object, ByVal e As System.EventArgs)
Private Sub Toolbar_ItemClick(ByVal sender As Object, ByVal e As System.EventArgs)
RaiseEvent vps_ItemClick(sender, e)
End Sub
Public Sub New()
' This call is required by the Windows Form Designer.
InitializeComponent()
Dim btn As ToolStripMenuItem = Nothing
Dim txt As ToolStripTextBox = Nothing
'Loop through MenuStrip items for Custom Handler
For x As Integer = 0 To Toolbar.Items.Count - 1
If Toolbar.Items(x).GetType.ToString = "System.Windows.Forms.ToolStripMenuItem" Then
btn = DirectCast(Toolbar.Items(x), ToolStripMenuItem)
RemoveHandler btn.Click, AddressOf Toolbar_ItemClick
AddHandler btn.Click, AddressOf Toolbar_ItemClick
End If
Next
End Sub
我的问题是,当我使用快捷键时,vps_ItemClick没有启动,但如果我使用click,它工作正常。你能帮我找出问题所在或提出更好的解决方法吗。谢谢。真的不需要编写大部分代码。这里不需要使用
AddHandler
。只需让IDE像往常一样为您生成事件处理程序。要创建单个方法来处理多个组件的事件,请执行以下操作:
Handles
子句中生成一个包含多个事件的方法。如果愿意,可以将方法的名称更改为更通用的名称。在这种情况下,您可能会得到如下结果:
Private Sub ToolStripMenuItems_Click(sender As Object, e As EventArgs) Handles SecondToolStripMenuItem.Click,
FirstToolStripMenuItem.Click
End Sub
然后,我建议您遵守.NET命名和引发事件的约定,即
Private Sub ToolStripMenuItems_Click(sender As Object, e As EventArgs) Handles SecondToolStripMenuItem.Click,
FirstToolStripMenuItem.Click
OnItemClick(EventArgs.Empty)
End Sub
Public Event ItemClick As EventHandler
Protected Overridable Sub OnItemClick(e As EventArgs)
RaiseEvent ItemClick(Me, e)
End Sub
请注意,引发事件的对象应始终是发送方
。决不能将发送方
从一个事件处理程序传递到另一个事件。如果您希望您的ItemClick
事件指定单击了哪个项目,那么您可以通过e
参数执行此操作,例如
Public Class ItemClickEventArgs
Inherits EventArgs
Public ReadOnly Property Item As ToolStripMenuItem
Public Sub New(item As ToolStripMenuItem)
Me.Item = item
End Sub
End Class
然后:
Private Sub ToolStripMenuItems_Click(sender As Object, e As EventArgs) Handles SecondToolStripMenuItem.Click,
FirstToolStripMenuItem.Click
OnItemClick(New ItemClickEventArgs(DirectCast(sender, ToolStripMenuItem)))
End Sub
Public Event ItemClick As EventHandler(Of ItemClickEventArgs)
Protected Overridable Sub OnItemClick(e As ItemClickEventArgs)
RaiseEvent ItemClick(Me, e)
End Sub
您似乎在暗示,当按下
ToolStripMenuItem的快捷键时,它不会引发单击事件,而事实并非如此,除非有什么东西确实坏了。我建议做的第一件事是用通常的方法为每个菜单项创建处理程序,即在设计器中双击它们,然后在每个菜单项上设置一个断点,并测试当您按下快捷键时是否命中。谢谢您的回答。在我上面的代码中,当我按下快捷键时,该代码触发/执行工具栏\u ItemClick子项,但其中的RaiseEvent vps\u ItemClick(sender,e)未触发。我不知道出了什么问题。如果调用了工具栏\u ItemClick
方法,则将执行RaiseEvent
。它将引发事件,或者在某个地方引发异常。如果没有例外的话,那么它就起作用了,而你只是在某个地方做错了别的事情。您需要正确地调试代码,即使用断点并单步执行代码。对于缺少信息,很抱歉,下面是对我的问题的进一步说明。同样,我创建了一个UserControl名称vpsGridView,我在另一个表单上使用了两次(它用于子表),例如DGrid_1和DGrid_2。是,事件的执行没有问题。但我无法确定是哪一个触发了事件,因为它们具有相同的快捷键。我怎样才能确定是哪一个被解雇了。你现在描述的是与问题主题无关的事情。如果您现在有一个不同的问题,那么将此问题标记为已回答,并在新主题上发布一个新问题。