Question

Supposons qu'un formulaire gagnant comporte certains champs de saisie et que l'utilisateur entre / entre de nouveau certaines données.

Comment conserver les données saisies précédemment par l'opération "annuler"?

Je veux juste connaître le meilleur moyen de le réaliser.

Était-ce utile?

La solution

Il y a quelques options. L'important est de commencer à le concevoir au début du projet. Essayer de l'ajouter à un projet existant peut être très coûteux s'il n'a pas été conçu pour cette fonctionnalité.

Il existe quelques modèles fondamentaux dont vous voudrez tirer parti:

  1. MVC ou Observer . La première clé ne concerne pas tant la mise en œuvre religieuse ou empreinte de zèle de votre architecture de haut niveau. Ce qui est important , c’est que votre logiciel reconnaisse la différence entre son état actuel et l’état affiché, et effectue un découplage approprié. Il doit exister un couplage commun et clairement défini entre votre état visuel et votre état d'application. Ceci vous fournit l'architecture commune nécessaire pour créer une commande (voir n ° 2).

  2. Le modèle Commande . Vous obtenez beaucoup de qualité avec le modèle de commande (bien que cela puisse se faire au détriment d’un code qui semble devoir être généré par un assistant). L'approche spécifique que vous adoptez pour le modèle de commande peut varier (une classe par commande avec implémentation via des substitutions par rapport à une classe par plusieurs commandes avec une implémentation via des gestionnaires d'événements, par exemple), mais les commandes constituent "l'action". classe que @Ralph a suggéré de structurer une pile autour.

    Cela peut être un peu délicat, mais l’approche générale consisterait à écouter un événement qui "commettrait". données de l'état visuel à l'état de l'application. validé peut être un bon crochet pour une Textbox . Le Cliquez Un événement> aurait plus de sens pour un bouton . Lorsque cette validation se produit, vous créez la commande associée à ce contrôle, vous essayez d'exécuter la commande et vous ajoutez la commande à votre pile d'annulation si la commande aboutit. Maintenant, vous suivez exactement ce qui se passe et exactement les données avec lesquelles cela se produit.

  3. Le modèle Memento . @JP Sorti la dernière pièce du puzzle. Vous pouvez utiliser un mémento sur la commande enregistrée pour stocker l'état du contrôle affecté avant l'exécution de la commande. Ceci, associé à un membre UnExecute () sur l'interface de votre commande, devrait constituer le dernier élément de conception essentiel dont vous avez besoin pour effectuer votre tâche.

Ce qui est bien avec une approche structurée comme celle-ci, c'est que vous disposez maintenant d'un point d'extension naturel pour un comportement supplémentaire devant se produire sur une base de commande. Les transactions sont un ajustement naturel, par exemple. Dans mon projet actuel, j'utilise WPF ICommand (dans mon projet winforms) pour indiquer si une commande donnée CanExecute () à un moment donné. Cela me permet d'activer et de désactiver les widgets d'interface utilisateur correctement d'une manière purement commandée. :)

Ce qui est malheureux, c’est que cette structure intégrée à Winforms (pour autant que je sache) ne soit pas très supportée, vous devez donc en construire la plupart à partir de rien. Aucune pièce n'est particulièrement compliquée, mais vous pouvez vous retrouver à générer une bonne quantité de code essentiellement passe-partout pour chaque commande. C'est aussi une technique de conception omniprésente. Pour qu’il soit efficace, il doit être utilisé de manière cohérente dans toutes les parties appropriées de la demande. Cela rend la mise à niveau de la fonctionnalité assez coûteuse, surtout si le code d'origine est étroitement lié et incohésif.

Autres conseils

Je ne sais pas si WinForms / .Net possède un type de fonctionnalité d'annulation intégrée dont vous pouvez tirer parti. Mais ce que vous recherchez réellement, c'est une structure de données Stack qui vous aide à gérer une liste d'actions. Vous devrez créer un type d’action " action " objet pour représenter les actions qu'un utilisateur peut effectuer et au fur et à mesure de leur progression dans l'application, vous devrez pousser ces actions sur la pile. Lorsqu'ils appuient sur le bouton d'annulation, ou sur Ctrl-Z ou quelle que soit la méthode utilisée pour lancer l'action d'annulation, vous supprimez l'action en cours et restaurez l'état de l'application à l'action précédente.

Voici un aperçu très basique et détaillé de la procédure, mais j’imagine que l’implémentation d’une telle fonctionnalité peut devenir assez complexe. Imaginez simplement comment cela doit fonctionner pour un programme comme Adobe Photoshop. : O

Cela peut ne pas être la meilleure façon de procéder, selon ce que vous essayez d'accomplir, mais vous pouvez utiliser un richtextbox et faire appel à la méthode d'annulation intégrée à ce contrôle.

Par exemple:

richTextBox1.Undo();

Ceci et cela pourrait aider.

CTRL + Z fonctionne sur des contrôles individuels.

Si vous travaillez avec des données et un BindingSource, vous pouvez "annuler". les modifications non persistantes apportées aux enregistrements en appelant le CancelEdit ou vous pouvez recharger les données pour la base de données.

Je suggère de déterminer les exigences d'annulation spécifiques et leurs avantages pratiques avant de commencer la conception et la mise en œuvre. J'ai hérité d'une application WinForms utilisant une annulation séquentielle à plusieurs opérations via une pile générique d '"action". objets en interne. Cependant, il s’est avéré qu’aucun des utilisateurs de l’application à qui j’avais parlé ne demandait la fonctionnalité! Et la façon dont cette application fonctionne, si j'étais un utilisateur de l'application, je ne me verrais pas non plus utiliser la fonctionnalité.

La fonctionnalité d'annulation aurait pu être plus utile dans ce cas s'il s'agissait d'une annulation "sélective"; où l'utilisateur peut sélectionner n'importe quelle opération / édition de plusieurs éditions précédentes effectuées avant la validation des données et restaurer cette édition dans son état d'origine, au lieu de ne pouvoir annuler que la dernière opération en premier, suivie de l'avant dernière opération , etc., comment cela a été mis en œuvre.

Dans tous les cas, l’application contient donc une complexité et des indirection inutiles, ce qui rend plus difficile et plus lent la tâche de "bouffer" et d’apporter des modifications et des améliorations aux fonctionnalités existantes, dans le cas présent sans grand bénéfice réel. Depuis que j'ai hérité du projet, j'ai implémenté de nouvelles fonctionnalités sans annulation et personne ne s'est plaint.

Vous pouvez également trouver la bibliothèque Reversi utile, comme plusieurs autres semblent en avoir. Voir [ rel="nofollow noreferrer"> http://www.codeproject.com/KB/dotnet/ reversibleundoredo.aspx] [1] ou [ceci] [2]

[1]: http://www.codeproject.com/KB/dotnet /reversibleundoredo.aspx Rendre votre application réversible afin de prendre en charge les fonctions d'annulation et de rétablissement

[2]: http://www.codeproject.com /script/Articles/Article.aspx?aid=22502 Annuler Répétition

Dépend du nombre de niveaux d'annulation que vous souhaitez avoir.

Vous pouvez stocker les valeurs avant qu'elles soient "validées". Dans un certain sens, vous pouvez "Restaurer" dans une collection de niveaux de formulaire pour chacun des contrôles. en cliquant sur un bouton pour permettre à l'utilisateur de revenir en arrière.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top