Я тоже искал ответ на этот вопрос. В итоге я написал общую подпрограмму, которую можно вызывать из любого DataGridView, так как у меня было много приложений, и я хотел, чтобы все они вели себя одинаково. Это хорошо сработало для меня, поэтому я хотел поделиться этим со всеми, кто наткнулся на этот пост.
В событие MouseClick для DGV я добавляю код
Private Sub SomeGrid_MouseClick(sender As Object, e As MouseEventArgs) Handles SomeGrid.MouseClick
DGV_MouseClick(sender, e)
End Sub
, который вызывает следующую подпрограмму, которую я храню в общем модуле
Public Sub DGV_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
Try
Dim dgv As DataGridView = sender
Dim h As DataGridView.HitTestInfo = dgv.HitTest(e.X, e.Y)
If h.RowIndex > -1 AndAlso h.ColumnIndex > -1 AndAlso dgv.Columns(h.ColumnIndex).CellType Is GetType(DataGridViewComboBoxCell) Then
Dim cell As DataGridViewComboBoxCell = dgv.Rows(h.RowIndex).Cells(h.ColumnIndex)
If Not dgv.CurrentCell Is cell Then dgv.CurrentCell = cell
If Not dgv.IsCurrentCellInEditMode Then
dgv.BeginEdit(True)
CType(dgv.EditingControl, ComboBox).DroppedDown = True
End If
End If
Catch ex As Exception
End Try
End Sub
Я никогда не обнаруживал никаких ошибок, я включил код Try..Catch только для некоторых редких случаев, о которых я не мог думать, что может вызвать исключение. Я не хотел, чтобы пользователя беспокоили сообщения об ошибках для этого сценария. Если сабвуфер выходит из строя, то, скорее всего, DGV будет вести себя так же, как обычно.