Открытие контекстного меню в DataGridView

#vb.net

#vb.net

Вопрос:

Ну, привет! Просто у меня возник быстрый вопрос о коде, который у меня есть. Я пытаюсь открыть контекстное меню, когда щелкаю правой кнопкой мыши по ячейке в моем DataGridView. Вот что у меня есть:

 Private Sub DataGridView1_CellMouseClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles DataGridView1.CellMouseClick
    If e.Button = Windows.Forms.MouseButtons.Right Then
        If e.ColumnIndex = -1 = False And e.RowIndex = -1 = False Then
            Me.DataGridView1.ClearSelection()
            Me.DataGridView1.CurrentCell = Me.DataGridView1.Item(e.ColumnIndex, e.RowIndex)
            DataGridView1.ContextMenuStrip = mnuCell
        End If
    End If
End Sub
  

К сожалению, когда я впервые щелкаю правой кнопкой мыши по программе, она не сразу открывает контекстное меню. Он только выбирает ячейку. Но если я снова щелкну по нему правой кнопкой мыши, откроется контекстное меню.

Моя вторая проблема заключается в том, что если я щелкну правой кнопкой мыши по другой ячейке, когда контекстное меню все еще открыто, оно не выберет другую ячейку, которую я щелкнул правой кнопкой мыши. Что я делаю не так?

Ответ №1:

Контекстное меню появится перед запуском события CellMouseClick, поэтому вместо этого переместите свой код в CellMouseDown.

 Private Sub DataGridView1_CellMouseDown(sender As Object, e As DataGridViewCellMouseEventArgs) Handles DataGridView1.CellMouseDown
    If e.Button = Windows.Forms.MouseButtons.Right Then
        If e.ColumnIndex <> -1 And e.RowIndex <> -1 Then
            Me.DataGridView1.ClearSelection()
            Dim cell = Me.DataGridView1.Item(e.ColumnIndex, e.RowIndex)
            Me.DataGridView1.CurrentCell = cell
            cell.Selected = True 'Needed if you right click twice on the same cell
            DataGridView1.ContextMenuStrip = mnuCell
        End If
    End If
End Sub
  

Комментарии:

1. Ооо, правильно, потому что событие MouseClick включает мышь вверх и вниз. Вау, никогда бы не поймал это сам. Спасибо! 🙂