2010-08-27 6 views
0

J'ai un problème étrange avec la référence et le clonage d'objet, que je ne suis pas capable de résoudre. J'ai une classe MyClass qui consiste en un nom de propriété. J'ai aussi mon contrôle utilisateur custon, qui possède une propriété de type MyClass - myclassproperty. Ces contrôles sont placés sur le formulaire. Si je clique sur un de contrôle un nouveau formulaire apperas. Je passe un argument à une nouvelle forme - myclasspropertyProblème étrange avec la référence et le clonage d'objet

clonedproperty est un objet cloné. Pour le clonage j'utiliser ce code, que je trouve ici sur stackoverflow

public static class ObjectCloner 
    { 
     /// <summary> 
     /// Reference Article http://www.codeproject.com/KB/tips/SerializedObjectCloner.aspx 
     /// 
     /// Provides a method for performing a deep copy of an object. 
     /// Binary Serialization is used to perform the copy. 
     /// </summary> 


      /// <summary> 
      /// Perform a deep Copy of the object. 
      /// </summary> 
      /// <typeparam name="T">The type of object being copied.</typeparam> 
      /// <param name="source">The object instance to copy.</param> 
      /// <returns>The copied object.</returns> 
      public static T Clone<T>(T source) 
      { 
       if (!typeof(T).IsSerializable) 
       { 
        throw new ArgumentException("The type must be serializable.", "source"); 
       } 

       // Don't serialize a null object, simply return the default for that object 
       if (Object.ReferenceEquals(source, null)) 
       { 
        return default(T); 
       } 

       IFormatter formatter = new BinaryFormatter(); 
       Stream stream = new MemoryStream(); 
       using (stream) 
       { 
        formatter.Serialize(stream, source); 
        stream.Seek(0, SeekOrigin.Begin); 
        return (T)formatter.Deserialize(stream); 
       } 
      } 
     }  

} 

Dans la nouvelle forme que j'ai une zone de texte qui se lient au nom déposé dans l'objet clonedproperty

txtName.DataBindings.Add (« Texte », clonedproperty, "Nom");

J'ai aussi deux boutons sur mon formulaire '' sauvegarder '' et '' annuler ''. Si je clique sur Annuler, la forme est simplement fermée, mais si je clique sauver je ne STH comme ça

this.myclassproperty = clonedproperty 

et la forme est fermée. À mon avis, myusercontrol.myclassproperty fait actuellement référence à clonedproperty, donc si je clique une fois de plus sur myusercontrol, la nouvelle valeur (que j'ai saisie précédemment) montre.

Cependant, j'ai ancienne valeur tout le temps :(

+0

Le code est un peu difficile à suivre sans le contexte environnant. Le premier extrait de code à trois lignes est-il censé s'exécuter dans le formulaire contenant vos contrôles utilisateur? Qu'est-ce qui se passe avec 'this.myclassproperty = myclassproperty;' Avez-vous une variable locale nommée 'myclassproperty', ou était-ce censé être' myusercontrol.myclassproperty'? Que faites-vous avec la variable 'clonedproperty' après l'avoir assignée? À la fin, vous mentionnez l'exécution de 'this.myclassproperty = clonedproperty' quand un bouton est cliqué, ainsi' clonedproperty' est-il réellement une variable de niveau de classe? –

Répondre

0

Sans quoi que ce soit d'autre pour aller plus loin, je dirais que la forme utilise peut-être l'objet et de faire les modifications, puis obtenir cloné. Essayez le clonage d'abord, puis l'ouverture la forme comme celui-ci

clonedproperty = ObjectCloner.Clone (myclassproperty). forme NewForm = new NewForm (myusercontrol.myclassproperty) this.myclassproperty = myclassproperty;

Si cela ne fonctionne pas peut vous envoyer la code de formulaire d'appel?