На первый взгляд, вызов EndEdit(true)
действительно делает то же самое, что и выдача e.CancelEdit = true
в AfterLabelEdit или BeforeLabelEdit обработчике событий. Однако эти два подхода не эквивалентны и не используются для одной и той же цели.
Лучше всего продемонстрировать на примере реального поведения:
Они делают то же самое, потому что:
- Если вы позвоните
EndEdit(true)
, узел дерева выйдет из режима редактирования и отменит изменения,
- Если вы введете
e.CancelEdit = true
во время AfterLabelEdit
, узел дерева выйдет из режима редактирования и отменит изменения.
Но они не эквивалентны, потому что:
- Если вы не звоните
EndEdit(true)
, режим редактирования узла дерева не изменится (очевидно),
- Если вы не выполните
e.CancelEdit = true
во время AfterLabelEdit
, узел дерева все еще выйдет из режима редактирования (и передаст изменения),
- Если вы не выполните
e.CancelEdit = true
в течение BeforeLabelEdit
, узел дерева все еще войдет в режим редактирования.
Другое отличие состоит в том, что EndEdit()
вызывает AfterLabelEdit
, но AfterLabelEdit
не вызывает рекурсивный вызов (к счастью).
Теперь обычно NodeLabelEditEventArgs.CancelEdit используется для проверки, т. Е. Для отклонения недопустимых изменений в метке узла дерева (во время AfterLabelEdit
) или для полного запрета пользователю редактировать метки некоторых узлов ( во время BeforeLabelEdit
). В обоих случаях пользователь либо уже закончил, либо еще не начал редактирование метки.
EndEdit () предполагается использовать для принудительной фиксации или отмены редактирования , пока пользователь все еще редактирует метку . Конечно, это означает, что EndEdit(false)
- это зло и неправильно , потому что оно совершает потенциально критическое изменение до , когда пользователь закончил печатать, и без его согласие. Так что я никогда не видел, чтобы это так называлось.
Вызов EndEdit(true)
для отмены текущего редактирования может быть полезен, если что-то еще абсолютно требует фокус прямо сейчас и вы не хотите автоматически подтверждать неполное редактирование, когда дерево узел теряет фокус. Отбрасывать работу вашего пользователя таким образом все еще грубо.
В те времена, когда у MFC было законное использование эквивалента EndEdit(true)
, отмените редактирование, когда пользователь нажал клавишу ESC
. Хотите верьте, хотите нет, в то время эта функция не поддерживалась из коробки в MFC (и, возможно, до сих пор нет сегодня, я не проверял).
Но в настоящее время, по моему мнению, осталось мало пользы для EndEdit()
. Лучше пусть он будет пухом.