Skitzafreak
Skitzafreak

Reputation: 1917

Detect when a user stops editing a DataGridViewCell

I am working on a VB.Net project and am trying to set up a DataGridView so that users can edit data. I'd like to set it up so that when a user finishes editing a cell, either through navigating to a new cell, or by pressing the Enter key, something happens.

I started by creating a method to store the old data that was in the cell:

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

Now my next logical step was to create a KeyDown event for the DataGridView

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

Well here we have our first problem. While the DataGridView is in edit mode for a cell, it does not register KeyDown events. No matter what I did, I could not trigger the KeyDown event handler until after moving to another cell. Essentially I need to hit Enter twice in order for the MessageBox to appear.

So from here I figured, okay, lets put together an event handler for EditingControlsShowing that should work!

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

And here the MessageBox only appears once the editting has begun, and I can do nothing once I am finished.

So I am utterly confused as to what to do here. To restate what I want to do I am trying to set up a DataGridView that has the following functionality for the Cells:

  1. While editing the value within a Cell, if you press the Enter key, you get a prompt asking if you want to save your changes.
  2. If instead of Enter, you press any other key that would turn off Cell editing (like Tab or the Arrow Keys) you get a prompt asking if you are sure you wish to cancel editing.

I really don't know what to do here, so any and all help is greatly appreciated.

Upvotes: 1

Views: 338

Answers (1)

First you need to check if you are in edit mode:

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

Then you can override the ProcessCmdKey function:

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

Return True from the function if you want to suppress the key.

Upvotes: 2

Related Questions