#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, который не выполняет клонирование формы. ТАКИМ образом, вы клонируете модель, но форма остается прежней. Я бы предложил использовать глубокое копирование для этих целей с использованием двоичной сериализации