检测用户何时停止编辑DataGridViewCell

时间:2018-08-13 17:12:28

标签: vb.net datagridview

我正在研究VB.Net项目,并试图设置DataGridView,以便用户可以编辑数据。我想对其进行设置,以便当用户完成对单元格的编辑时,通过导航到新单元格或按Enter键,都会发生某些事情。

我首先创建一种方法来存储单元格中的旧数据:

Private oldCellVal As String = ""
Private oldCellRow As Integer
Private oldCellCol As Integer

Private Sub dg_CellBeginEdit(ByVal sender As Object, ByVal e As DataGridViewCellCancelEventArgs) Handles dg.CellEndEdit
    oldCellVal = dg.Rows(e.RowIndex).Cells(e.ColumnIndex).Value
    oldCellRow = e.RowIndex
    oldCellCol = e.ColumnIndex
End Sub

现在,我的下一个逻辑步骤是为DataGridView创建一个KeyDown事件

Private Sub dg_KeyDown(ByVal sender As Object, ByVal e As KeyEventArgs) Handles dg.KeyDown
    If e.KeyCode <> Keys.Enter Then
        If dg.IsCurrentCellInEditMode() Then
          If MessageBox.Show("Would you like to cancel editing?", "Confirmation", MessageBoxButtons.YesNoCancel) = DialogResult.Yes Then dg.CurrentCell.Value = oldCellVal  
        End If
    ElseIf e.KeyCode = Keys.Enter Then
        If MessageBox.Show("Would you like to save these changes?", "Confirmation", MessageBoxButtons.YesNoCancel) = DialogResult.Yes Then MessageBox.Show("Saved")
    End If
End Sub

在这里,我们遇到了第一个问题。当DataGridView处于单元格的编辑模式时,它不会注册KeyDown事件。无论我做什么,直到移动到另一个单元格之前,我都无法触发KeyDown事件处理程序。基本上,我需要按两次Enter键才能显示MessageBox。

所以从这里开始,我想让我们为EditingControlsShowing设置一个事件处理程序,该事件处理程序应该可以工作!

Private Sub dg_EditingControlsSHow(ByVal sender As Object, ByVal e As DataGridViewEditingControlShowingEventArgs) Handles dg.EditingControlShowing
    MessageBox.Show("Please work")
End Sub

在这里,MessageBox仅在编辑开始后才出现,一旦完成,我将无能为力。

所以我完全不知道该怎么办。为了重述我想做的事情,我正在尝试为DataGridView设置具有以下功能的单元格:

  1. 在单元格中编辑值时,如果按Enter键,则会提示您是否要保存更改。
  2. 如果您按下Enter键,而不是按Enter键,则会关闭单元格编辑功能(例如Tab或箭头键),则会提示您询问是否确定要取消编辑。

我真的不知道该怎么办,因此非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

首先,您需要检查您是否处于 edit 模式:

Private isEditing As Boolean = False 

Private Sub DataGridView1_CellBeginEdit(sender As Object, e As DataGridViewCellCancelEventArgs) Handles DataGridView1.CellBeginEdit
    isEditing = True
End Sub

Private Sub DataGridView1_CellEndEdit(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellEndEdit
    isEditing = False
End Sub

然后,您可以覆盖 ProcessCmdKey 函数:

Protected Overrides Function ProcessCmdKey(ByRef msg As Message, keyData As Keys) As Boolean

    If isEditing = True Then

        Select Case keyData
            Case Keys.Left

            Case Keys.Right

            Case Keys.Enter

            Case Else

        End Select

    End If

    Return MyBase.ProcessCmdKey(msg, keyData)
End Function
如果要隐藏,请

从函数返回 True