2016-10-10 7 views
0

У меня есть datagridview в моей форме в настоящее время. Идея, которую я пытаюсь сделать, - уловить возможную проблему с двойной записью, когда пользователь редактирует ячейку в datagridview. Я должен проверить поле для повторяющегося значения (которое CheckContestantList уже делает, перебирая каждую строку и возможное совпадение). При совпадении предполагается, что предыдущее значение будет восстановлено, и появится всплывающее окно с сообщением и предупредит пользователя при сбросе этого поля в режим редактирования.Проверка элементов DataGridView

Однако, когда пользователь нажимает клавишу Enter, индикатор текущей строки перемещается на один ... и отбрасывает все. Я уже немного поработал над этим вопросом, но я не могу показать, что текущая ячейка активна, даже если кто-то нажимает Enter.

Как разрешить клавише Enter, чтобы подтвердить подтверждение ввода, но не двигаться вниз на одну строку?

Private Sub dgvContestantPool_CellEndEdit(sender As Object, e As DataGridViewCellEventArgs) Handles dgvContestantPool.CellEndEdit 
    ' On the editing of the field, check to see if the value already exists. 

    If CheckContestantList(dgvContestantPool.CurrentCell.Value) = True Then 

     ' Reset the value to the original value... 
     dgvContestantPool.ClearSelection() 
     dgvContestantPool.CurrentCell = dgvContestantPool.Rows(intCurrentRow).Cells("ContestantName") 
     dgvContestantPool.Rows(intCurrentRow).Selected = True 

     dgvContestantPool.CurrentCell.Value = strOldValue 
     dgvContestantPool.BeginEdit(True) 

     ' Alert the user to try again... 
     MessageBox.Show("Entered value already exists in the list, try again or delete the entry.", "INVALID DATA - Already Exists", MessageBoxButtons.OK, MessageBoxIcon.Error) 
    Else 
     ' Go ahead and let the edit persists. 
    End If 

End Sub 

Private Sub dgvContestantPool_CellBeginEdit(sender As Object, e As DataGridViewCellCancelEventArgs) Handles dgvContestantPool.CellBeginEdit 
    strOldValue = dgvContestantPool.CurrentCell.Value 
    intCurrentRow = dgvContestantPool.CurrentRow.Index 

End Sub 

ответ

2

Вы используете неправильное datagridview событие, если вы собираетесь подтвердить ввод, вы можете использовать _CellValidating событие.

Вот пример:

Private Sub dgvContestantPool_CellValidating(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellValidatingEventArgs) Handles dgvContestantPool.CellValidating 
    If CheckContestantList(dgvContestantPool.Rows(e.RowIndex).Cells(e.ColumnIndex).EditedFormattedValue) = True Then 
     'Your code goes here 
    End If 
... 

Теперь, например, значение ячейки является недействительным, вы можете вызвать e.Cancel = True в cell_validating случае, так что пользователь не может перейти к другим клеткам, если значение ячейки не является действительным или нажмите клавишу ESC. Это выйдет из ячейки и вернется к ее предыдущему/оригинальному значению.

+0

Просто нужно было сделать одно изменение, чтобы условие If только проверял «грязные» ячейки, но все это работает! Благодарю. –

+0

Я рад, что это поможет вам. Счастливое кодирование. –

Смежные вопросы