IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Cloner un objet pour le modifier et pouvoir annuler les changements.


Sujet :

VB.NET

  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Par défaut Cloner un objet pour le modifier et pouvoir annuler les changements.
    Bonjour à tous,
    Je ne trouve pas de solution satisfaisante à mon problème, une aide me serait vraiment bienvenue.

    J'ai un objet 'Equipement' qui signale tout ses changements à la BLL ainsi qu'à l'UI principale au travers d'un event 'PropertyChanged'.
    La BLL se charge de calculer cette objet intégralement lors de chaque changement d'une de ses propriétés. A ce niveau là il n'est pas possible d'annuler la modification mais cela ne me dérange pas.

    J'ai aussi un formulaire d'édition que j'appelle lorsque je veux créer ou modifier un 'équipement', je lui passe donc en paramètre l'objet à modifier. Celui-ci dispose de 2 boutons 'OK' et 'Annuler'
    L'es contrôles de ce formulaire appellent la procédure de calcul de la BLL de manière à afficher les résultats immédiatement sur ce dernier.

    Dans ce formulaire je travaille directement sur l'objet 'Equipement' (passé en argument par référence) car celui ci dispose de beaucoup de propriété et je souhaite éviter des recréer une variable pour chaque propriété.
    Et donc voici le problème qui se pose : les résultats des calculs sont écrits directement dans l'objet sans avoir la possibilité d'annuler.

    J'ai imaginé de cloner l'objet pour éviter ca mais je ne sais pas du tout si c'est une bonne idée, si cela est possible, et comment...

    Si c'est un problème d'architecture du programme qui se pose, je suis prêt à faire quelques modifications mais pas trop grosse car le programme est presque fini.
    Merci beaucoup.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Public Class Equipement
            Inherits BaseElement
            Private _Prop1 As Single
            Private _Prop2 As Single
            Private _Prop3 As Single
    Public Property Prop1 As Single
                Get
                    Return _Prop1
                End Get
                Set(ByVal value As Single)
                    _Prop1 = value
                    MyBase.OnPropertyChanged()
                End Set
    End Property
    ' ... etc
    End Class

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    Public Class BLLProjet
    Friend Sub OnEquipementPropertyChanged(sender As Object, e As PropertyChangedEventArgs)
                Static Dim EventAlreadyActive As Boolean
                If EventAlreadyActive Then Exit Sub ' Evite les appels récursifs lors des changements de propriétés.
     
                Dim Equipement As Equipement = CType(sender, Equipement)
                Dim PropName As String = e.PropertyName
     
                EventAlreadyActive = True
                RecalculEquipementObject(Equipement)
                EventAlreadyActive = False
     
    End Sub
    Public Sub RecalculEquipementObject(Equipement As Equipement)
                With Equipement
                   .Prop3 = .Prop1 + .Prop2
                    ' ... etc
     
     
                End With
            End Sub
    End Class
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     frmEditEquipement.ShowDialog(MonEquipement)

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Par défaut
    Bon, apriori j'ai trouver ceci qui ressemble à ce que je voudrais :

    J'ai un message d'erreur sur la 1ere fonction qui me dit que 'MemberwiseClone' est 'protected' , du coup je ne peux pas l'essayer.
    Je n'ai pas pu essayer 'ShallowCopy' et 'DeepCopy' non plus car il doit manquer une implémentation quelque part....j'ai écrit les lignes en commentaires dans clone1 juste pour test.

    Par contre la 2eme fonction semble me convenir :
    Je pense partir sur cette solution. Tous ca pour éviter d'écrire des lignes de code pour dupliquer chaque propriété dans une variable....

    N'hésitez pas à me dire si vous penser qu'il y a mieux à faire....mais je n'ai pas trouvé d'autre solution.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     Public Function Clone1(equipement As Equipement) As Equipement
            Dim Newinstance As Equipement
            Newinstance = DirectCast(equipement.MemberwiseClone(), Equipement)
            'Dim Newinstance2 As Equipement = equipement.ShallowCopy()
            'Dim Newinstance3 As Equipement = equipement.DeepCopy()
     
            Return Newinstance
    End Function
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     Private Function Clone2(equipement As Equipement) As Equipement
            Dim NewInstance As New Equipement
            Dim value As Object = Nothing
            For Each p As PropertyInfo In equipement.GetType().GetProperties()
                value = p.GetValue(equipement, Nothing)
                If p.CanWrite Then p.SetValue(NewInstance, value)
                Console.WriteLine("{0}: {1}", p.Name, p.GetValue(equipement, Nothing))
            Next
     
           Return NewInstance
    End Function

Discussions similaires

  1. Réponses: 7
    Dernier message: 12/03/2015, 06h23
  2. Réponses: 3
    Dernier message: 01/06/2014, 22h23
  3. [Dojo] Récupérer un objet pour modifier ses attributs
    Par vermine dans le forum Bibliothèques & Frameworks
    Réponses: 14
    Dernier message: 03/02/2009, 11h53
  4. Réponses: 12
    Dernier message: 18/12/2007, 17h40
  5. [VB.Net 2.0] Comment récuperer le nom d'un objet pour le modifier ?
    Par pti_pierrot dans le forum Windows Forms
    Réponses: 5
    Dernier message: 07/07/2006, 13h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo