Как отмена DataGridViewCellValidatingEventArgs может заменить все обработчики событий на себя? - PullRequest
0 голосов
/ 23 мая 2018

У меня очень странная проблема в приложении VB.У меня есть функция, написанная так:

В самом внутреннем состоянии, два утверждения здесь закомментированы.Было обнаружено, что они не влияют на странное поведение.Это минимальный пример, который я нашел вызывающим проблемы.

(Обратите внимание, что имена объектов были изменены в этом примере.)

Private Sub MyForm_CellValidating(ByVal sender As Object, ByVal e As DataGridViewCellValidatingEventArgs) Handles myDGV.CellValidating
    Dim dgv As DataGridView = CType(sender, DataGridView)
    Select Case dgv.Columns(e.ColumnIndex).Name
        Case "uniqueColumn"
            ' Validate that the values in our unique column are unique. 
            For i As Integer = 0 To dgv.RowCount - 1
                If i <> e.RowIndex Then
                    ' Here i != j, so compare to the value... 
                    If e.FormattedValue = dgv.Rows(i).Cells(e.ColumnIndex).FormattedValue Then
                        e.Cancel = True
                        'dgv.ShowRowErrors = True
                        'dgv.Rows(e.RowIndex).ErrorText = "Data in the unique column must be unique"
                    End If
                End If
            Next 'i
        Case Else
            ' Perform no validation. 
    End Select

End Sub

Какую проблему вы спрашиваете?По какой-то необъяснимой причине, всякий раз, когда выполняется строка

e.Cancel = True

, почти все кнопки и виджеты форм во всем приложении , включая даже кнопку закрытия в его панели окна (чтопользователь будет использовать для выхода из приложения) прекратить делать то, что он делал ранее, и вместо этого теперь вызывать этот обработчик событий.

Другими словами, закомментирование этой строки (и проверка вручную при отправке формы) решает проблемы.Я хотел бы знать, почему это происходит, хотя.Некоторые указатели:

Вот список вещей, на которые не влияет:

  • Кнопка свертывания и разворачивания на верхней панели.
  • Все объекты в строке меню.

Этот обработчик является закрытым для своего класса формы, на него больше не ссылаются нигде в приложении.

Я в растерянности.Только как?Что может вызвать это?

1 Ответ

0 голосов
/ 23 мая 2018

e.Cancel для остановки проверки, если ввод считается неверным.Это заставляет ячейку все еще иметь фокус, поскольку пользователь должен исправить то, что он сделал неправильно.Событие CellValidating будет вызываться снова всякий раз, когда ячейка теряет фокус, пока ваш код не сочтет введенные данные правильными.

Вы можете использовать свойство Control.CausesValidation для контроля того, должен ли элемент управления (например, кнопка) вызывать события проверки, когда он получает фокус.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...