Pregunta

Suponga que, un formulario de ganancia tiene ciertos campos de entrada y el usuario ingresa / ingresa nuevamente algunos datos.

¿Cómo retener los datos ingresados ??previamente por la operación 'deshacer'?

Solo quiero saber la mejor manera de lograrlo.

¿Fue útil?

Solución

Hay algunas opciones. Lo importante es que comiences a diseñarlo al principio del proyecto. Tratar de agregarlo a un proyecto existente puede ser muy costoso si no se diseñó con esta capacidad en mente.

Hay algunos patrones fundamentales que querrás aprovechar:

  1. MVC o Observer . La primera clave no es tanto la implementación religiosa o zelote de la arquitectura de alto nivel. Lo que es importante es que su software reconoce la diferencia entre su estado actual y el estado visualizado, y se desacopla adecuadamente. Debe haber un acoplamiento común y claramente definido entre su estado visual y el estado de su aplicación. Esto le proporciona la arquitectura común que necesita para crear un comando (ver # 2).

  2. El comando . Obtiene mucha calidad con el patrón de comando (aunque puede tener el costo de un código que parece que debe ser generado por un asistente). El enfoque específico que adopta para el patrón de comando puede variar (una clase por comando con implementación mediante invalidaciones en comparación con una clase por muchos comandos con implementación mediante controladores de eventos, por ejemplo), pero los comandos son la acción " acción " clase que @Ralph sugirió estructurar una pila alrededor.

    Esto puede ser un poco complicado, pero el enfoque general sería escuchar un evento que cometa " cometer " Datos del estado visual al estado de la aplicación. El Validated evento podría ser un buen gancho para un Textbox . El Haga clic evento tendría más sentido para un Button . Cuando se produce esa confirmación, crea el comando asociado con ese control, intenta ejecutar el comando y agrega el comando a su pila de deshacer si el comando se completa correctamente. Ahora estás siguiendo exactamente lo que está sucediendo y exactamente los datos con los que está sucediendo.

  3. El patrón Memento . @JP Sacó la última pieza del rompecabezas. Puede usar un recuerdo en el comando guardado para almacenar el estado del control afectado antes de que se ejecutara el comando. Esto, combinado con un miembro UnExecute () en la interfaz de su comando, debe ser la última pieza central de diseño que necesita para realizar su tarea.

Lo bueno de un enfoque estructurado como este es que ahora tiene un punto de extensión natural para el comportamiento adicional que debe ocurrir en una base de comando. Las transacciones son un ajuste natural, por ejemplo. En mi proyecto actual, estoy usando WPF ICommand (en mi proyecto winforms) para proporcionar comentarios sobre si un comando dado CanExecute () en cualquier momento dado. Esto me permite habilitar y deshabilitar apropiadamente los widgets de UI de forma puramente controlada por comandos. :)

Lo desafortunado es que no hay mucho soporte para esta estructura integrada en Winforms (que yo sepa), por lo que tendrá que crear la mayor parte desde cero. Ninguna pieza individual es particularmente complicada, pero puedes encontrarte generando una cantidad justa de código mayormente para cada comando. También es una técnica de diseño generalizada. Para que sea efectivo, debe usarse de manera consistente en las partes apropiadas de la aplicación. Esto hace que la actualización de la funcionalidad sea bastante costosa, especialmente si el código original está estrechamente acoplado e incohesivo.

Otros consejos

No estoy seguro de si WinForms / .Net tiene algún tipo de función Deshacer incorporada que pueda aprovechar. Pero lo que realmente está buscando es una estructura de datos de pila para ayudarlo a administrar una lista de acciones. Deberá crear algún tipo de " acción " El objeto representa las acciones que un usuario podría hacer y a medida que avanzan a través de la aplicación, deberá insertar estas acciones en la Pila. Cuando presionen el botón de deshacer, o Ctrl-Z o cualquier otro método para iniciar la acción de deshacer, saldrá de la acción actual y restaurará el estado de la aplicación a la acción anterior.

Este es un resumen muy básico y de alto nivel de cómo funcionaría, pero me imagino que la implementación de esta característica puede ser bastante compleja. Imagínese cómo debe funcionar para un programa como Adobe Photoshop. : O

Es posible que esta no sea la mejor manera de hacerlo, dependiendo de lo que esté intentando lograr, pero puede usar un cuadro de texto enriquecido e invocar el método de deshacer incorporado en ese control.

Por ejemplo:

richTextBox1.Undo();

This y esto puede ayudar.

CTRL + Z funciona en controles individuales.

Si trabajas con datos y un BindingSource, puedes " deshacer " los cambios no persistentes en el registro (s) llamando a CancelEdit o, alternativamente, puede volver a cargar los datos de la base de datos.

Mi sugerencia es determinar los requisitos específicos de deshacer y sus beneficios prácticos antes de comenzar el diseño y la implementación. Heredé una aplicación de WinForms que usó una operación múltiple de deshacer secuencial a través de una pila de acción genérica " acción " Objetos internos. Sin embargo, resultó que ninguno de los usuarios de la aplicación con la que hablé usó ni solicitó la función. Y la forma en que funciona esta aplicación en particular, si yo fuera un usuario de la aplicación, tampoco me vería usando la función.

La funcionalidad Deshacer podría haber sido más útil en este caso si se tratara de un deshacer 'selectivo'; donde el usuario puede seleccionar cualquier operación / edición individual de varias ediciones previas realizadas, antes de la confirmación de datos, y restaurar esa edición única a su estado original, en lugar de poder deshacer la primera operación primero, seguida de la segunda a la última operación , etc. que es cómo se implementó.

En cualquier caso, la aplicación, por lo tanto, contiene una complejidad e indirección innecesarias, lo que hace que cada vez sea más difícil "asimilar" y realizar cambios y mejoras en la funcionalidad existente, en este caso por poco o ningún beneficio real. Desde que heredé el proyecto, he implementado nuevas funciones sin deshacer y nadie ha tenido quejas.

También puede encontrar útil la biblioteca Reversi, como parece que tienen otras muchas. Consulte [ http://www.codeproject.com/KB/dotnet/ reversibleundoredo.aspx] [1] o [this] [2]

[1]: http://www.codeproject.com/KB/dotnet /reversibleundoredo.aspx Haga que su aplicación sea reversible para admitir deshacer y rehacer

[2]: http://www.codeproject.com /script/Articles/Article.aspx?aid=22502 Deshacer Rehacer

Depende de cuántos niveles de deshacer, desea tener.

Puede almacenar valores antes de que se " confirmado " en cierto sentido, en una colección de nivel de formulario para cada uno de los controles, que puede " Restaurar " al hacer clic en un botón para que el usuario regrese.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top