Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 使用快捷键时如何引发事件_Vb.net_Datagridview_User Controls - Fatal编程技术网

Vb.net 使用快捷键时如何引发事件

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

我在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)

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像往常一样为您生成事件处理程序。要创建单个方法来处理多个组件的事件,请执行以下操作:

  • 在设计器中选择多个零部件
  • 打开“属性”窗口
  • 单击事件按钮
  • 双击感兴趣的事件
  • 然后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。是,事件的执行没有问题。但我无法确定是哪一个触发了事件,因为它们具有相同的快捷键。我怎样才能确定是哪一个被解雇了。你现在描述的是与问题主题无关的事情。如果您现在有一个不同的问题,那么将此问题标记为已回答,并在新主题上发布一个新问题。