DataGridView右键单击事件并将参数传递给sub

时间:2018-06-18 07:54:07

标签: vb.net datagridview

我在论坛上阅读了很多内容,但我无法找到解决问题的方法。

我有 func openDocumentPicker() { let importMenu = UIDocumentMenuViewController(documentTypes: ["public.item"], in: .import) importMenu.delegate = self importMenu.modalPresentationStyle = .formSheet self.present(importMenu, animated: true, completion: nil) } DataGridView

我的目标是从上下文菜单调用一个函数并传递参数,例如所选dgv行的亚麻布。

这是我的代码,其中包含ContextMenu,但我如何将一些参数传递给函数?

ContextMenu

修改

现在我有一个有效的解决方案,但我认为这不是最佳解决方案,我可以做很多改进。

也许可以编写自定义事件,可以传递gridview的某些数据。我希望有人有兴趣提供一些改进,以改进以下(工作)代码,看起来像专业。

Private Sub dataGridView1_MouseClick(ByVal sender As DataGridView, ByVal e As MouseEventArgs) Handles DataGridView1.MouseClick
    If e.Button = MouseButtons.Right Then
        Dim m As New ContextMenu

        m.MenuItems.Add(New MenuItem("Sub1"))
        m.MenuItems.Add(New MenuItem("Sub2"))

        Dim currentMouseOverRow As Integer = DataGridView1.HitTest(e.X, e.Y).RowIndex

        m.Show(DataGridView1, New Point(e.X, e.Y))
    End If
End Sub

3 个答案:

答案 0 :(得分:0)

以下是一个示例,说明如何右键单击DataGridView中的单元格,然后在单击菜单项时执行相对于该单元格的操作:

Private lastClickedCell As DataGridViewCell

Private Sub DataGridView1_CellMouseClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles DataGridView1.CellMouseClick
    If e.ColumnIndex >= 0 AndAlso
       e.RowIndex >= 0 Then
        lastClickedCell = DataGridView1.Item(e.ColumnIndex, e.RowIndex)
    End If
End Sub

Private Sub DataGridView1_MouseClick(sender As Object, e As MouseEventArgs) Handles DataGridView1.MouseClick
    If e.Button = MouseButtons.Right AndAlso
       DataGridView1.HitTest(e.X, e.Y).Type = DataGridViewHitTestType.Cell Then
        'Display the menu when right-clicking on a cell.
        ContextMenuStrip1.Show(DataGridView1, e.Location)
    End If
End Sub

Private Sub ClearToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ClearToolStripMenuItem.Click
    'Clear the cell that was right-clicked.
    lastClickedCell.Value = Nothing
End Sub

在此示例的设计器中创建了ContextMenuStrip。即使你需要动态选择项目,我也会建议你也这样做。您可以清除菜单,添加和/或删除网格的CellMouseClickMouseClick事件处理程序或菜单的Opening事件处理程序中的项目。

答案 1 :(得分:0)

Private Sub DataGridView1_MouseClick(sender As Object, e As MouseEventArgs) Handles DataGridView1.MouseClick
        Dim col As New DataGridTextBoxColumn
        If e.Button = MouseButtons.Right Then
            Dim m As New ContextMenuStrip
            col.TextBox.ContextMenuStrip = m

            Dim tsp As New ToolStripMenuItem("Sub1", Nothing, New EventHandler(AddressOf TestMessage))

            Dim tsp1 As New ToolStripMenuItem("Sub2", Nothing, New EventHandler(AddressOf TestMessage))

            m.Name = "Menulist"
            m.Items.Add(tsp)
            m.Items.Add(tsp1)
            Dim currentMouseOverRow As Integer = DataGridView1.HitTest(e.X, e.Y).RowIndex
            m.Show(DataGridView1, New Point(e.X, e.Y))
        End If
    End Sub

    Private Sub TestMessage()
        MessageBox.Show("Clicked")
    End Sub

答案 2 :(得分:0)

试试并使用'标签':

    Dim currentMouseOverRow As Integer

Structure MyStructure
    Public x As Integer
    Public y As Integer
End Structure

Private Sub DataGridView1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles DataGridView1.MouseClick
    Dim Mystruct As MyStructure
    If e.Button = Windows.Forms.MouseButtons.Right Then

        Dim m As New System.Windows.Forms.ContextMenuStrip
        Dim MymenuToolStripMenuItem1 As New System.Windows.Forms.ToolStripMenuItem
        MymenuToolStripMenuItem1.Text = "menu1"
        AddHandler MymenuToolStripMenuItem1.Click, AddressOf MymenuToolStripMenuItem1_Click
        m.Items.Add(MymenuToolStripMenuItem1)
        Dim MymenuToolStripMenuItem2 As New System.Windows.Forms.ToolStripMenuItem
        MymenuToolStripMenuItem2.Text = "menu2"
        AddHandler MymenuToolStripMenuItem2.Click, AddressOf MymenuToolStripMenuItem2_Click
        m.Items.Add(MymenuToolStripMenuItem2)
        Mystruct.x = e.X
        Mystruct.x = e.X
        MymenuToolStripMenuItem2.Tag = Mystruct
        currentMouseOverRow = DataGridView1.HitTest(e.X, e.Y).RowIndex

        m.Show(DataGridView1, New Point(e.X, e.Y))
    End If
End Sub

Private Sub MymenuToolStripMenuItem1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
    MessageBox.Show("click Menu1:" & currentMouseOverRow)
End Sub

Private Sub MymenuToolStripMenuItem2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
    Dim Mystruct As MyStructure
    Mystruct = CType(CType(sender, System.Windows.Forms.ToolStripMenuItem).Tag, MyStructure)
    MessageBox.Show("click Menu2:" & currentMouseOverRow & " x:" & Mystruct.x & " y:" & Mystruct.y)
End Sub