none
DataGridView Liée à Une DataTable => Fonction Undo ?? RRS feed

  • Question

  • Bonjour,

         dans mon appli, j'ai une DataGridView liée à une DataTable.

    Il est possible d'ajouter des items, de faire des copiers collers, d'ajouter des lignes et de supprimer des lignes.

    Je souhaiterais savoir si une sorte de fonction UNDO est réalisable pour ce type de composant.

    La fonction permettrait de faire un UNDO sur nimporte quelle fonction dernierement executée (ajout, modification, ajout de ligne, suppression(s) de ligne(s)...). Est-ce qu'il existe  quelque chose de tout fait ou simplement réalisable à ce niveau ??

    merci bien.

    vendredi 7 février 2014 13:59

Réponses

Toutes les réponses

  • Bonjour

    Vous pouvez utiliser RejectChanges http://msdn.microsoft.com/fr-fr/library/system.data.dataset.rejectchanges(v=vs.110).aspx.
    Le problème dans ce cas est qu'il va rejeter tous les modifications effectuées depuis le dernier AcceptChanges (). 
    Donc soit vous enregistrez après chaque modification et permettez un seul UNDO, soit vous avez 2 buttons  - Enregistrer/Annuler el laissez au l’utilisateur la décision de enregistrer ou annuler les modifications depuis le dernier « Enregistrer » . 

    Cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    vendredi 7 février 2014 15:14
  • Bonjour

    Un petit retour SVP?

    Merci!

    Cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    lundi 10 février 2014 12:42
  • Bonjour,

    est-ce qu'il y a la possibilité de remonter les AcceptChanges() lorsque l'on réalise plusieurs RejectChanges() successifs?

    Je souhaiterais en effet pouvoir réaliser plusieurs Undo les uns à la suite des autres.

    Merci.

    mardi 11 février 2014 07:23
  • La seule solution c'est d’appliquer RejectChanges au niveau de la ligne.

    Mais ça vas rejeter tous les motifs faites sur une ligne.

    La seule solution c'est d’appliquer RejectChanges au niveau de la ligne (DataRow ) .
    Mais ça vas rejeter tous les motifs faites sur une ligne.
    Par exemple si on modifie la ligne1 après  ligne 2  et de nouveau Ligne 1, avec RejectChanges sur la "Ligne 1" vous rejetez tous les modifications.

    La solution complète sera de créer une pile des modifications avec le Type, et la ligne avant la modification. Dans cette manière  vous avez toute l’histoire des modifications et vous pouvez revenir.

    Cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    mardi 11 février 2014 07:53
  • Mais comment faire une fonction Undo du même type que celle

    de Excel ?

    Avec possibilité de faire des Undo Successifs ??

    Je ne comprends pas trop la subtilité.

    mardi 11 février 2014 08:54
  • C'est ce que je vous ai deja propose avec:

     

    La solution complète sera de créer une pile des modifications avec le Type, et la ligne avant la modification. Dans cette manière vous avez toute l’histoire des modifications et vous pouvez revenir.

    Ici je parle de type de modification - Create/Update/Delete.
    Pour Undo, vous vérifiez toujours le type du dernier élément dans la liste et si c'est Create (ajouter une ligne) vous la supprimez, si c'est Update vous recouperez les anciennes valeurs, si c'est Delete vous ajoutez la ligne avec les anciennes valeurs.
    Evidement après traiter un élément de la pile, vous le supprimez de la pile. Pour faire encore un Undo, vous prenez toujours le dernier élément de la pile.

    Cordialement, 


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    mardi 11 février 2014 09:28
  • Dans le cas de la solution complète, on utiliserait pas Reject Changes donc ??

    On se contenterait de venir faire machine arrière sur chaque Modification dans la pile manuellement c'est bien cela ?

    Parce que par exemple si une ligne a été supprimée, le Undo consiste à la recréer et donc la pas possibilité de faire reject changes ?

    mardi 11 février 2014 13:00
  • Oui, c'est vrai, pas de RejectChanges.
    Le Undo se fait avec du code qui modifie la ligne, la supprime ou l'ajoute à partir de ce qu'on a enregistrée dans la pile.

    Cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    • Marqué comme réponse Thom_A mardi 11 février 2014 13:59
    mardi 11 février 2014 13:06
  • Bonjour,

    dans l'ensemble cette fonction marche bien,

    j'ai réussi à faire une pile avec les évenements à passer à la moulinette du UNDO (REDO aussi possible).

    Les évenements traités sont InsertLine dans le DataGridView, RemoveLine(s) dans le DataGridView

    et UpdateLineContent dans le DataGridView.

    Au global, le UNDO et le redo fonctionne.

    Pour le UpdateLineContent, je récupère les valeurs de la Ligne avant modification dans le CellBeginEdit

    et j'insère l'évènement dans la pile dans le CellContentChange.

    Les seuls disfonctionnements mineurs que j'observe sont les suivants :

    - Dans ma DataGridView, j'ai des ComboBox. Lorsque je clique sur la ComboBox pour l'éditer, l'évènement CellBeginEdit est correctement lancé. Par contre lorsque je modifie la valeur l'évènement CellContentChange est lancé plusieurs fois de suite (j'empile donc plusieurs évenements au lieu d'un...).

    - Aussi lorsque je fais des Undo sur les évements insertLine, certaines fois les lignes ne sont pas supprimées.

    jeudi 13 février 2014 16:40