我正在研究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设置具有以下功能的单元格:
我真的不知道该怎么办,因此非常感谢您的帮助。
答案 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 。