2010-08-27 2 views
0

У меня есть странная проблема со ссылкой и клонированием объектов, которые я не могу решить. У меня есть класс MyClass, который состоит из свойства Name. У меня также есть мой пользовательский контроль custon, который обладает свойством типа MyClass - myclassproperty. Эти элементы управления помещаются в форму. Если я нажму на элемент управления новой формы apperas. Я передаю один аргумент новой форме - myclasspropertyСтранная проблема с ссылкой и клонированием объектов

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

clonedproperty - это клонированный объект. Для клонирования я использую этот код, который я нашел здесь, на 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); 
       } 
      } 
     }  

} 

В новой форме у меня есть текстовое поле, которое связыванию с поданным Именем в объекте clonedproperty

txtName.DataBindings.Add («Текст», clonedproperty, «Name»);

У меня также есть две кнопки в моей форме '' save '' и '' cancel ''. Если я нажимаю отмена, форма просто закрыта, но если я нажимаю сохранить меня STH как то

this.myclassproperty = clonedproperty 

и форма закрывается.

На мой взгляд, в настоящий момент myusercontrol.myclassproperty является ссылкой на clonedproperty, поэтому, если я еще раз нажму на myusercontrol, появится новое значение (которое я ввел ранее).

Однако я старое значение все время :(

+0

Код немного трудно следовать без окружающего контекста. Предполагается, что первый 3-строчный фрагмент кода должен выполняться в форме, содержащей ваши пользовательские элементы управления? Что случилось с 'this.myclassproperty = myclassproperty;'? У вас есть локальная переменная с именем 'myclassproperty', или это должно было быть' myusercontrol.myclassproperty'? Что вы делаете с переменной «clonedproperty» после ее назначения? В конце вы упоминаете выполнение 'this.myclassproperty = clonedproperty' при нажатии кнопки, так что' clonedproperty' фактически является переменной уровня класса? –

ответ

0

Без что-нибудь еще, чтобы идти дальше, я бы сказал, что форма может быть с помощью объекта и внесения изменений, а затем получить клонированы. Попробуйте клонировать первый затем открыть форма, как это

clonedproperty = ObjectCloner.Clone (myclassproperty). форма NEWFORM = новый Newform (myusercontrol.myclassproperty) this.myclassproperty = myclassproperty;

Если это не работает, вы можете разместить код вызывающих форм?

Смежные вопросы