Съемка с бедра, сериализация формы и десериализация ее во вторую переменную.:) Я постараюсь разобраться в этом и придумаю еще один ответ.
Некоторые вещи, на которые стоит обратить внимание ... Вы хотите мелкую или глубокую копию?То есть, если форма имеет ссылку на объект, хотите ли вы скопировать ссылку (чтобы обе формы указывали на один и тот же объект) или также сделать копию этого объекта?Вы должны быть осторожны ... с объектами, содержащими ссылки на другие объекты, нет гарантии, в каком порядке они будут десериализованы
Вам не нужно, но рекомендуется наследовать от ICloneable, который имеет толькоодин метод, Clone()
.Переопределите этот метод с помощью кода, подобного следующему:
public object Clone() {
BinaryFormatter formatter = new BinaryFormatter();
MemoryStream stream = new MemoryStream();
formatter.Serialize(stream, this);
stream.Seek(0, SeekOrigin.Begin);
return (MyForm) formatter.Deserialize(stream);
}
Для использования:
MyForm form2 = form1.Clone() as MyForm;
if (form2 != null) {
// yahoo!
}
* Редактировать *На самом деле здесь есть отличный пример SO, который создает универсальный объектный копир.Очень хорошо! Глубокое клонирование объектов
* Редактировать *Проблема с сериализацией формы заключается в том, что не все значения действительно могут быть сериализованы ... они не имеют смысла, например, дескрипторы отдельных элементов управления.
Чтобы сделать сериализуемую форму, вам необходимо реализоватьИнтерфейс ISerializable и реализуйте надлежащий конструктор и метод GetObjectData ().В GetObjectData вам нужно будет перечислить ваши элементы управления и сохранить свойства (например, Текст или Значение), которые вы хотите скопировать.Конструктор читает их обратно.Это выглядит так:
public partial class MyForm : Form, ISerializable {
public MyForm() {}
public MyForm(SerializationInfo info, StreamingContext context) : base() {
foreach (Control control in Controls) {
control.Text = info.GetString(control.Name);
}
}
public void GetObjectData(SerializationInfo info, StreamingContext context) {
foreach (Control control in Controls) {
info.AddValue(control.Name, control.Text);
}
}
}
Идея состоит в том, чтобы перечислить форму, поместить каждое значение в поток SerializationInfo и вытащить его обратно при создании нового объекта.Это позволит моему оригинальному коду для клонирования работать.