winforms — указать форму для клонирования

#c# #.net #winforms #visual-studio

#c# #.net #winforms #visual-studio

Вопрос:

Мой программный класс имеет:

 Application.Run(new Form1());
  

в классе form1 у меня есть:

 model = new Model(this);

    private void userEnteredText()
 {
       Model clonedModel = (Model)model.Clone();
       this.myButton.Size = new System.Drawing.Size(10,5);
       MessageBox.Show("buttons made small");
       this = clonedModel;
      MessageBox.Show("clone complete and buttons restored to orig size");
}
  

в классе модели у меня есть:

     public Model(Form1 form1)
    {
        myform = form1;
    }

public object Clone()
{
   return new Model(myform);
}
  

Мой исходный объект form1 имеет действительно большой размер кнопок. После того, как пользователь вводит значение в текстовое поле: я клонирую объект модели и вызываю метод, который делает кнопки действительно маленькими. Как я могу затем настроить объект модели так, чтобы он указывал обратно на исходный объект модели с большими кнопками?

Я получаю эту ошибку: «Не удается назначить это, потому что оно доступно только для чтения»

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

Ответ №1:

Один вопрос — ожидается ли поведение, когда при клонировании обе модели ссылаются на одно и то же Form ? Clone() метод просто создает новый экземпляр модели, но он по-прежнему ссылается на тот же Form объект,

Вы можете сохранить состояние исходной модели в другом частном поле, например

 private Model backupModel;
  

и перед применением пользовательских значений просто создайте резервную копию, а затем восстановите текущую модель, например:

  private void userEnteredText()
 {
       this.backupModel = model;     
       Model clonedModel = (Model)model.Clone();
       this.myButton.Size = new System.Drawing.Size(10,5);
       MessageBox.Show("buttons made small");
       model = this.backupModel;     
       MessageBox.Show("clone complete and buttons restored to orig size");
 }
  

Комментарии:

1. после назначения clonedModel она не используется, это опечатка?

2. Я хочу иметь возможность клонировать модель и форму, чтобы при восстановлении она отображала исходный размер кнопки формы (т. Е. До действия пользователя).

3. @toop : итак, проблема в методе clone, который не выполняет клонирование формы. ТАКИМ образом, вы клонируете модель, но форма остается прежней. Я бы предложил использовать глубокое копирование для этих целей с использованием двоичной сериализации