使用自定义函数以dinamically方式添加context_menu项

时间:2016-08-25 07:30:11

标签: vb.net

我以dinamically方式创建上下文菜单,并希望将menuitems分配给我自己的函数(带参数)。不幸的是,不按照我的意愿去。

以下示例说明了我想要做的事情。

Private Sub dgv_sub_CellMouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles dgv_sub.CellMouseUp

    If e.Button = Windows.Forms.MouseButtons.Right Then
        dgv_sub.Rows(e.RowIndex).Selected = True
        context_sub.Items.Clear()
        context_sub.Items.Add("Delete row " + dgv_sub.CurrentRow.Index.ToString, Nothing) AddressOf delRow(dgv_sub.CurrentRow.Index))
        context_sub.Items.Add("Delete all rows", Nothing) , AddressOf delRow(-1))
        context_sub.Show(New Point(Cursor.Position.X, Cursor.Position.Y))
    End If
End Sub

Private Sub delRow(ByVal rowtodelete As Integer)

End Sub

如何正确地做到这一点并按照描述使其工作?

1 个答案:

答案 0 :(得分:1)

这就是我通常做这些事情的方式:

  1. 预先填充ContextMenu

  2. ContextMenu分配给我的DataGridView

  3. 在每个ToolStripMenuItem

  4. 上添加活动
  5. 在每次活动中,我首先检查以确保选择了一行

  6. If dgv_sub.SelectedRows.Count > 0 Then

    然后,我使用

    得到正确的行

    SelectedRows(0)

    1. 为了使事情更整洁,您还可以使用DataGridView.MouseDown事件来确保当用户右键单击某一行时,它会被选中。

      Private Sub dgv_sub_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles dgv_sub.MouseDown
          If e.Button = Windows.Forms.MouseButtons.Right Then
              Dim hitTest As DataGridView.HitTestInfo
              hitTest = dgv_sub.HitTest(e.X, e.Y)
      
              If hitTest IsNot Nothing AndAlso hitTest.RowIndex > -1 Then
                  dgv_sub.CurrentCell = dgv_sub.Item(hitTest.ColumnIndex, hitTest.RowIndex)
                  dgv_sub.Rows(hitTest.RowIndex).Selected = True
              End If
          End If
      End Sub
      
    2. 由于您需要上下文项目是动态的,您必须在MouseDown事件中执行这些操作。

      为了正确添加项目,您仍需要正常的点击事件:

      context_sub.Items.Add("Name of Item", Nothing, AddressOf item_Click)
      

      然后像这样添加Sub

      Private Sub item_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
          'Add any logic here, you can still use the dgv_sub.SelectedRows here
      End Sub
      

      理想情况下,您需要为每个需要添加的上下文菜单项创建不同的Sub