2010-05-11 6 views

Respuesta

6

Pues bien, en la superficie, llamando EndEdit(true) de hecho parece hacer la misma cosa que la emisión de e.CancelEdit = true en un controlador de AfterLabelEdit o BeforeLabelEdit evento. Sin embargo, los dos enfoques no son equivalentes y no se usan con el mismo propósito.

mejor para demostrar con un ejemplo el comportamiento real:

Ellos hacer lo mismo, porque:

  • Si llama EndEdit(true), el nodo del árbol dejará modo de edición y descartar los cambios,
  • Si emite e.CancelEdit = true durante AfterLabelEdit, el nodo de árbol abandonará el modo de edición y descartará los cambios.

Pero no son equivalentes, ya que:

  • Si no lo hace llamada EndEdit(true), el modo de árbol de nodos de edición se no cambio (obviamente),
  • Si no problema e.CancelEdit = true durante AfterLabelEdit, el nodo del árbol todavía deja el modo de edición (y confirma los cambios),
  • Si no lo hace tema e.CancelEdit = true durante BeforeLabelEdit, el nodo del árbol se todavía entrar en el modo de edición.

Otra diferencia es que EndEdit() desencadena AfterLabelEdit, pero no de forma recursiva AfterLabelEdit desencadenar en sí (por suerte).

Ahora, por lo general NodeLabelEditEventArgs.CancelEdit se utiliza para la validación, es decir, para descartar modificaciones no válidos a la etiqueta de nodo de árbol (durante AfterLabelEdit) o prevenir completamente al usuario de la edición de las etiquetas de algunos nodos (durante BeforeLabelEdit). En ambos casos, el usuario ya ha terminado o aún no ha comenzado a editar la etiqueta.

EndEdit() se supone que se utilicen para cometer la fuerza o cancelar la edición mientras el usuario todavía está editando la etiqueta. Por supuesto, eso significa que es EndEdit(false)mal y equivocado, ya que envía un cambio potencialmente romper antes de que el usuario ha terminado de escribir y sin su consentimiento. Entonces, nunca lo había visto así, de hecho.

Calling EndEdit(true) para descartar la edición actual podría ser útil si algo más requiere absolutamente el foco ahora y no quieren Autocommit la edición incompleta cuando el nodo del árbol pierde el foco. Sin embargo, desperdiciar el trabajo de su usuario de esa manera todavía es grosero.

De vuelta en los días de MFC, hubo un uso legítimo para el equivalente EndEdit(true): cancelar la edición cuando el usuario presiona la tecla ESC. Lo creas o no, esa función no fue compatible con la caja de MFC en ese momento (y tal vez todavía no es hoy, no lo compruebo).

Pero hoy en día, no hay mucho uso para EndEdit() en mi opinión. Mejor que descanse en paz.

+0

Malvado o no, tuve que llamar a EndEdit cuando iba al menú superior y mi nodo no abandonaba el modo de edición. En mi humilde opinión, esa es la principal diferencia entre ellos: puede llamar a EndEdit desde cualquier lugar, mientras que no puede usar CancelEdit si AfterLabelEdit aún no se activó. –

Cuestiones relacionadas