TreeNode.EndEdit против NodeLabelEditEventArgs.CancelEdit - PullRequest
8 голосов
/ 11 мая 2010

В чем разница между TreeNode.EndEdit и настройкой NodeLabelEditEventArgs.CancelEdit?

1 Ответ

6 голосов
/ 02 декабря 2010

На первый взгляд, вызов 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(). Лучше пусть он будет пухом.

...