2016-08-25 68 views
0

我创建上下文菜单dinamically并希望将菜单项分配给我自己的函数(带参数)。不幸的是,不要按我的意愿去。使用自定义函数dinamically添加context_menu项目

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

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

你非常接近但是我不确定你是否真的需要这是动态的。你可以在之前添加这两个项目并添加一个单击事件,然后在'MouseDown'中设置你想要的可见性。让我知道如果这没有帮助 –

+0

嗨基思。这里还有其他未描述的功能,因为在这个上下文菜单下的情况可能会有很大的不同。在这个例子中,我展示了足以描述我的需求的简化版本。 – user1697111

+0

好吧,我明白了,我会在几分钟后发布我的答案:) –

回答

1

这是怎么我通常做这几样东西:

  1. 有一个预先填充ContextMenu

  2. 分配ContextMenuDataGridView

  3. 添加活动的每一个ToolStripMenuItem

  4. 在每一个事件中,首先我做一检查,以确保该行已选定

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你需要添加的项目

    +0

    谢谢基思,这是非常广泛的答案。仍然...我怎么知道在item_Click下哪个menuitem调用它?这是问题的重要部分。 – user1697111

    +0

    您可以使用sender参数。因此,如果您将'sender'强制转换为'ToolStripMenuItem',您就可以确切地知道是谁调用了它:Dim menu as ToolStripMenuItem = Ctype(sender,ToolStripMenuItem)' –

    +0

    再次感谢。这非常有用。我会在你的答案帮助下工作。 – user1697111