ContextMenuStrip选中的项目在UserControl中丢失

时间:2015-01-12 18:40:10

标签: vb.net datagridview user-controls contextmenu

我有一个VB.NET用户控件,它嵌入到另一个用户控件中,并嵌入到表单中。内部用户控件具有由DataGridView行单击触发的contextmenustrip。这成功激活事件处理程序(我看到“确定”消息),但发件人不发送所选项(我没有看到其他MsgBox消息)。这是代码:

Public CMSV As ContextMenuStrip

Private grdSourceViewerCurrentRow As Long

Public Sub grdSourceViewer_RowHeaderMouseClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles grdSourceViewer.RowHeaderMouseClick
    'code to review/edit source details
     Select Case e.Button
        Case Windows.Forms.MouseButtons.Right
            grdSourceViewerCurrentRow = e.RowIndex  'retain for downstream code
            CMSV = New ContextMenuStrip
            AddHandler CMSV.MouseClick, AddressOf SourceViewDocumentationEdit
            CMSV.Items.Add("Edit")
            CMSV.Items.Add("Transfer to Evidence")
            Dim Pt As Point = New Point()
            Pt.X = grdSourceViewer.PointToClient(Cursor.Position).X
            Pt.Y = grdSourceViewer.PointToClient(Cursor.Position).Y + 20

            CMSV.Show(sender, Pt)

        Case Windows.Forms.MouseButtons.Left
            Exit Sub
        Case Else
            Exit Sub
    End Select
End Sub

Public Sub SourceViewDocumentationEdit()
    MsgBox("OK") 'I can see it reaches here
    Dim cc As ToolStripItemCollection = CMSV.Items
    Dim SelectedItem As Integer = -1
    Dim SelectedValue As String = ""

    For i As Integer = 0 To cc.Count - 1
        If cc.Item(i).Selected Then
            SelectedItem = i
            SelectedValue = cc.Item(SelectedItem).Text
            Exit For
        End If
    Next

    Select Case SelectedValue
        Case "Edit"
            MsgBox("Edit code here")
        Case "Transfer to Evidence"
            MsgBox("Transfer code here")
    End Select
End Sub

这里有什么问题?为什么我会丢失有关所点击项目的信息?

2 个答案:

答案 0 :(得分:0)

您需要使用ToolStripMenuItem而不仅仅是字符串。然后,您可以为其点击事件添加处理程序。

Dim tsmi As New ToolStripMenuItem
tsmi.Text = "Edit"
AddHandler tsmi.Click, AddressOf ItemClicked
CMSV.Items.Add(tsmi)

然后事件子:

Private Sub ItemClicked(sender As Object, e As EventArgs)
 'item clicked
 'sender object would be the ToolStripMenuItem
End Sub

答案 1 :(得分:0)

为什么每次都重新创建菜单?

无论如何,请存储CMSV.Items.Add()返回的ToolStripMenuItem,然后将其连接起来。

简化示例:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    CMSV = New ContextMenuStrip
    Dim TSMI As ToolStripMenuItem
    TSMI = CMSV.Items.Add("Edit")
    AddHandler TSMI.Click, AddressOf TSMI_Click
    TSMI = CMSV.Items.Add("Transfer to Evidence")
    AddHandler TSMI.Click, AddressOf TSMI_Click
    ' ...
End Sub

Private Sub TSMI_Click(sender As Object, e As EventArgs)
    Dim TSMI As ToolStripMenuItem = DirectCast(sender, toolstripmenuitem)
    Select Case TSMI.Text
        Case "Edit"
            Debug.Print("...Edit Code...")
            ' use "grdSourceViewerCurrentRow " in here?
        Case "Transfer to Evidence"
            Debug.Print("...Transfer to Evidence Code...")
            ' use "grdSourceViewerCurrentRow " in here?
    End Select
End Sub