我以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
如何正确地做到这一点并按照描述使其工作?
答案 0 :(得分:1)
这就是我通常做这些事情的方式:
预先填充ContextMenu
将ContextMenu
分配给我的DataGridView
在每个ToolStripMenuItem
在每次活动中,我首先检查以确保选择了一行
If dgv_sub.SelectedRows.Count > 0 Then
然后,我使用
得到正确的行 SelectedRows(0)
为了使事情更整洁,您还可以使用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
由于您需要上下文项目是动态的,您必须在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