【问题标题】:DataGridView: EditOnEnter selection mode allowing row deletionDataGridView:EditOnEnter 选择模式允许删除行
【发布时间】:2018-05-25 10:23:59
【问题描述】:

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

幸运的是,您可以将选择模式更改为EditOnEnter。这将在单击时立即选择一个单元格,而不是先选择行,从而将单击次数减少 1。但是,DataGridViews 的实现有些奇怪。每行中有一个“-1th”单元格不能手动选择。

When this '-1th' cell is selected, in the normal selection mode the row is selected, but in the "EditOnEnter" mode the 1st cell in而是选择该行。如果 DataGridView 设置为使用“Del”键启用行删除,则使用 E​​ditOnEnter 将无法使用此功能。

如何让两者都工作?即:我没有一个视图,用户最多可以点击 6 次(用户在必须多次点击时往往会更快地点击)来打开一个框,同时允许选择行使用特殊的 -1th 列?

【问题讨论】:

    标签: vb.net datagridview


    【解决方案1】:

    当单击行中的任何单元格时,需要以编程方式在两种编辑模式之间切换。但是,CellClick 事件触发得太晚:在该行已被选中之后。天真地切换 EditMode 将意味着行选择框上的 first 单击不起作用,而 second 会出现故障行为。

    诀窍是手动执行更多操作。以下事件处理程序,当附加到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 将在编辑模式之间闪烁,非常短暂地出现,好像该行已被选中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-18
      • 1970-01-01
      • 2011-07-24
      • 2016-01-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多