2016-02-23 9 views
0

Я кодирую приложение C# WinForms, где у меня есть форма для редактирования объектов. Форма имеет функцию setObject(), которая устанавливает объект в частное поле и функцию getObject() для получения объекта. Я вызываю эту функцию до вызова диалогового окна формы.Как скопировать объект перед редактированием, а затем заменить отредактированный объект при необходимости

После отображения формы значения объекта могут быть отредактированы. Такие элементы, как элементы в Collection<T>, могут быть изменены.

Если пользователь нажимает кнопку отмены, я не хочу, чтобы изменения сохранялись для объекта.

Как лучше всего закодировать это? Должен ли я копировать объект перед тем, как будет показана форма, и если нажата кнопка отмены, замените скопированный объект вместо отредактированного объекта формы?

Я думаю о ситуации, когда я хочу отредактировать объект, находящийся в коллекции. После редактирования объекта в форме пользователь нажимает кнопку отмены. Затем скопированный объект необходимо вставить обратно в коллекцию вместо отредактированного объекта. Поскольку вставляемый объект теперь является скопированным объектом, будет ли проблема с проверкой ссылок на старый объект?

Вот код для иллюстрации:

public class Simple1 
{ 
    public Collection<Simple2> simple2Collecton { get; set; } 
} 

public void simpleFunction() 
{ 
    Simple2 obj = simple2Collecton.First(); 
    bool value = (obj == simple2Collecton.First()); 
} 

Если у меня есть Simple2 объект, который ссылается на первый элемент в simple2Collecton, и я копирую Simple1 объекта после взаимодействия с формой редактирования. Будет ли следующий код еще == true:

bool value = (obj == simple2Collecton.First()); 

Вот мой текущий код, чтобы скопировать/клонировать объект:

public static T Clone<T>(this object objSource) 
{ 
    if (!typeof(T).IsSerializable) 
    { 
     throw new ArgumentException("The type must be serializable.", "source"); 
    } 

    if (Object.ReferenceEquals(objSource, null)) 
    { 
     return default(T); 
    } 
    using (MemoryStream stream = new MemoryStream()) 
    { 
     BinaryFormatter formatter = new BinaryFormatter(); 
     formatter.Serialize(stream, objSource); 
     stream.Position = 0; 
     return (T)formatter.Deserialize(stream); 
    } 
} 

ответ

0

Я хотел бы предположить, что каждый раз, когда открывается ваша форма вы сохраняете «главный экземпляр» (для редактирования) и частный «фиксированный экземпляр» вашего объекта в качестве ссылки на то, как это было до его редактирования. После этого я бы использовал отражение, чтобы скопировать фиксированный экземпляр в новый основной экземпляр и связать его с формой. В методе GetObject() вы всегда должны возвращать основной экземпляр и переключаться между ними, если пользователь нажимает на отмену.

+0

Не могли бы вы привести пример основного экземпляра и фиксированного экземпляра? Я не уверен в терминологии. – user3736648

0

Вот такой подход, который я использовал для этой цели;

setData(Object) 
{ 
//set object's values to form controls 
} 

OnEditBtn_Click(Sender,EventArgs) 
{ 
//Iterate over your list and find the object by ID and call setData with 
//searched object 
//setData(SearchedObjectToEdit); //It will set form controls with the object data 
} 
Cancel_Button_Click(Sender,EventArgs) 
{ 
//create a new tempObj, instance of the object. 
//call setData(tempObj), it will set the blank values to form controls, 
//showing that changes has been reverted 
} 

OnSubmitBtn_Click(Sender, EventArgs) 
{ 
//iterate over your collection and replace the edited object when ID is found 
} 

В соответствии с Вашим объектом копирования части, объект копирования будет проблемой, поскольку они являются ориентировочными типа, и они не будут обменены до тех пор, точно так же ссылки не найден.

Почему бы не отказаться от изменений на cancelBtnНажмите, а не сохраните их. Он не будет влиять на исходный объект в коллекции.