DataGridView:EditOnEnter选择模式允许行删除

时间:2018-05-25 10:23:59

标签: vb.net datagridview

默认情况下,DataGridView设置为EditOnKeystrokeOrF2编辑模式。这意味着需要两次或三次点击(间隔比用户的双击间隔更远)才能在此视图中更改组合框的值。由于这对于UI对象来说相当奇怪,您会倾向于认为控件不起作用。

幸运的是,您可以将选择模式更改为EditOnEnter。这将在单击时立即选择单元格,而不是首先选择行,将点击量减少1.但是,DataGridViews的实现有些奇怪。有一个' -1 th '在每行中无法手动选择的单元格。

当这' -1 th '选择单元格,在正常选择模式下选择行,但在" EditOnEnter"模式,而是选择行中的1 st 单元格。如果将DataGridView设置为使用" Del"键,然后使用EditOnEnter使其无法使用此功能。

如何兼顾两者?也就是说:我没有一个视图,用户可以点击最多6次(用户在必须多次点击时更快地点击)打开一个盒子,同时允许使用特殊的-1 th 列进行行选择?

1 个答案:

答案 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将在编辑模式之间闪烁,非常短暂地显示,就像选择了行一样。