VB.NET ContextMenuStrip动态子项。如何在每个子项目上添加事件?

时间:2018-10-13 17:05:58

标签: vb.net

单击子项后如何添加事件或获取contextmenustrip控件子项的文本?

这是我的代码:

Try
        enrollment_conn.Open()
        command = New SqlCommand("SELECT DISTINCT Section FROM dbo.Enrollees WHERE Grade = '" & Main.Enrollees_Cbx_grade.Text & "' AND Strand = '" & Main.Enrollees_Cbx_strand.Text & "' AND School_Year = '" & Main.Enrollees_Cbx_sy.Text & "' AND Enrolled = 'Yes'", enrollment_conn)
        reader = command.ExecuteReader

        Main.Enrollees_CMS_enrolleesList.Items.Clear()
        Dim tm = New ToolStripMenuItem("Filter")
        Main.Enrollees_CMS_enrolleesList.Items.Add(tm)
        While reader.Read
            tm.DropDownItems.Add(reader.Item("Section").ToString)

        End While
        enrollment_conn.Close()
    Catch ex As Exception
        MsgBox(ex.Message, vbExclamation)
    End Try

上面的代码添加了一个名为Filter的Toolstripitem,当我右键单击我的datagridview时。过滤器项显示并具有我通过使用查询添加的子项。问题是如何获取文本或将事件添加到子项?谢谢。

1 个答案:

答案 0 :(得分:2)

您在此处使用的Add方法已重载:

tm.DropDownItems.Add(reader.Item("Section").ToString)

您应该使用允许您指定Click事件处理程序的重载:

tm.DropDownItems.Add(reader.Item("Section").ToString, Nothing, AddressOf MenuItem_Click)

第三个参数是事件处理程序方法的委托。如果您不愿意自己从头开始编写它,最简单的选择就是让IDE为您创建一个。只需双击设计器中的菜单项,就会以通常的方式生成事件处理程序。然后,您可以从声明末尾删除Handles子句,并将名称更改为更通用的名称。然后,您可以访问通过sender参数单击的菜单项,该菜单项始终是引发事件的对象的引用:

Private Sub MenuItem_Click(sender As Object, e As EventArgs)
    Dim menuItem = DirectCast(sender, ToolStripMenuItem)

    'Use menuItem here.
End Sub

如果每个菜单项都需要数据,则可以在创建时将其分配给Tag属性,例如

tm.DropDownItems.Add(reader.Item("Section").ToString,
                     Nothing,
                     AddressOf MenuItem_Click).Tag = reader.Item("Data")

,然后在事件处理程序中再次将其取回:

Private Sub MenuItem_Click(sender As Object, e As EventArgs)
    Dim menuItem = DirectCast(sender, ToolStripMenuItem)
    Dim data = menuItem.Tag

    'Use data here.
End Sub