默认情况下,DataGridView设置为EditOnKeystrokeOrF2
编辑模式。这意味着需要两次或三次点击(间隔比用户的双击间隔更远)才能在此视图中更改组合框的值。由于这对于UI对象来说相当奇怪,您会倾向于认为控件不起作用。
幸运的是,您可以将选择模式更改为EditOnEnter
。这将在单击时立即选择单元格,而不是首先选择行,将点击量减少1.但是,DataGridViews的实现有些奇怪。有一个' -1 th '在每行中无法手动选择的单元格。
当这' -1 th '选择单元格,在正常选择模式下选择行,但在" EditOnEnter"模式,而是选择行中的1 st 单元格。如果将DataGridView设置为使用" Del"键,然后使用EditOnEnter使其无法使用此功能。
如何兼顾两者?也就是说:我没有一个视图,用户可以点击最多6次(用户在必须多次点击时更快地点击)打开一个盒子,同时允许使用特殊的-1 th 列进行行选择?
答案 0 :(得分:1)
当单击行中的任何单元格时,需要以编程方式在两种编辑模式之间切换。但是,CellClick
事件触发太晚:已经选择了行。天真只是切换EditMode
意味着第一次点击行选择框不起作用,而第二则会显示为越野行为。
诀窍是手动做更多事情。以下事件处理程序在附加到CellClick
事件时将解决几乎所有问题。
Private Sub CellSelect(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) Handles myDataGridView.CellClick
Dim dgv As DataGridView = CType(sender, DataGridView)
If dgv.Rows.Count = 0 Then
Return
End If
Dim rowToSelect As Integer = e.RowIndex
Dim columnToSelect As Integer = e.ColumnIndex
If e.RowIndex = -1 Then
rowToSelect = 0
End If
If rowToSelect >= dgv.Rows.Count Then
rowToSelect = 0
End If
If columnToSelect = -1 Then
dgv.EditMode = DataGridViewEditMode.EditOnKeystrokeOrF2
dgv.SelectionMode = DataGridViewSelectionMode.FullRowSelect
dgv.CurrentCell = Nothing
dgv.Rows(rowToSelect).Selected = True
Else
If columnToSelect >= dgv.Rows(rowToSelect).Cells.Count Then
columnToSelect = 0
End If
dgv.EditMode = DataGridViewEditMode.EditOnEnter
dgv.SelectionMode = DataGridViewSelectionMode.CellSelect
dgv.Rows(rowToSelect).Cells(columnToSelect).Selected = True
End If
End Sub
它的工作原理是取消设置所选单元格,然后以编程方式设置所选行。由于事先更改了EditMode,它将选择整行,而不仅仅是第一个单元格,即使第一次单击行选择框也是如此。
还有一大堆边缘情况,用户点击足够快可以在不存在的单元格上创建点击事件。所以我们假设这些点击是在单元格[0,0]上,所以至少我们的应用程序不会爆炸。
这还不是一个完美的解决方案。有了这个解决方案:一个小的图形故障仍然存在;对于大约一帧,DataGridView将在编辑模式之间闪烁,非常短暂地显示,就像选择了行一样。