Не удается получить DatGridView из EditMode в некоторых случаях
После проверки записи пользователя в ячейке, в событии CellValidating, если введенное значение недопустимо, я возвращаю значение обратно к тому, что было в ячейке изначально, перед входом в режим редактирования.
Моя проблема заключается в том, что для трех полей даты, которые есть в моем DGV, я не могу вывести ячейку из режима редактирования, если в ячейку не введена действительная действительная дата. Мне нужно разрешить пустые строковые значения в полях даты.
Я пытался принудительно вызвать DataGridView.EndEdit() в разных местах, но, как я уже сказал, поля "Дата" выйдут из режима редактирования только в том случае, если в элементе управления есть допустимая дата.
Вот мой соответствующий код для этого процесса:
Private initailEditControlText As String = ""
Private passedValidation As Boolean = True
Private Sub dgvEmployees_EditingControlShowing(sender As Object, e As DataGridViewEditingControlShowingEventArgs) Handles dgvEmployees.EditingControlShowing
initailEditControlText = e.Control.Text
End Sub
Private Sub dgvEmployees_CellValidating(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellValidatingEventArgs) Handles dgvEmployees.CellValidating
Dim enteredValue As String = dgvEmployees.Rows(e.RowIndex).Cells(e.ColumnIndex).EditedFormattedValue.ToString()
If e.ColumnIndex > 0 AndAlso dgvEmployees.Rows(e.RowIndex).Cells(e.ColumnIndex).IsInEditMode Then
If enteredValue = "" Then
' Default/empty Goals cells value is 0
If e.ColumnIndex = 13 OrElse e.ColumnIndex = 14 Then
dgvEmployees.Rows(e.RowIndex).Cells(e.ColumnIndex).Value = "0"
End If
ElseIf e.ColumnIndex = 4 Then
' Validation for the various cells based on e.columnIndex
' If failed, passedValidation set to FALSE
End If
If Not passedValidation Then
' Set value back to original value
dgvEmployees.EditingControl.Text = initailEditControlText
e.Cancel = True
Else
If initailEditControlText <> enteredValue Then
dgvEmployees.Rows(e.RowIndex).Cells(e.ColumnIndex).Style.BackColor = Color.LightPink
End If
End If
passedValidation = True
End If
End Sub
Private Sub dgvEmployees_DataError(sender As Object, e As DataGridViewDataErrorEventArgs) Handles dgvEmployees.DataError
If Not passedValidation Then
MessageBox.Show("Data error: " & vbCrLf & e.Exception.Message().ToString(), "An Error Occurred", MessageBoxButtons.OK, MessageBoxIcon.Error)
' For Date fields, the error message is: "String was not recognized as a valid DateTime."
'Else
' This causes an infinite loop for some reason...
' dgvEmployees.EndEdit()
End If
End Sub