C # Как мне программно создать копию моей формы? - PullRequest
3 голосов
/ 06 ноября 2010

Я использую winforms с Visual Studio 2008.

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

это можно сделать во время выполнения?как бы я это сделал?

не должно быть какое-то решение класса, как:

Form form2 = new Form();
form2 = form1 ???

Ответы [ 2 ]

5 голосов
/ 06 ноября 2010

Просто создайте еще один экземпляр того же класса. Используйте фактическое имя класса вместо базового класса Form.

Form form2 = new Form1();
form2.Show();
1 голос
/ 06 ноября 2010

Съемка с бедра, сериализация формы и десериализация ее во вторую переменную.:) Я постараюсь разобраться в этом и придумаю еще один ответ.

Некоторые вещи, на которые стоит обратить внимание ... Вы хотите мелкую или глубокую копию?То есть, если форма имеет ссылку на объект, хотите ли вы скопировать ссылку (чтобы обе формы указывали на один и тот же объект) или также сделать копию этого объекта?Вы должны быть осторожны ... с объектами, содержащими ссылки на другие объекты, нет гарантии, в каком порядке они будут десериализованы

Вам не нужно, но рекомендуется наследовать от 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 и вытащить его обратно при создании нового объекта.Это позволит моему оригинальному коду для клонирования работать.

...