Клонирование компонента GUI - PullRequest
3 голосов
/ 06 марта 2012

Мне нужна помощь, так как я относительно новичок в C #. Я в основном пытаюсь клонировать свойства компонента datagridview (содержимое строки / столбца отличается).

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

string newpagetitle = "tab_page" + (tab_control01.TabCount + 1);
TabPage newTab_page = new TabPage(newpagetitle);

DataGridView clonedDGV = new DataGridView();

clonedDGV = this.dataGridView1; //need to clone this
clonedDGV.Name=("DataGridView" + tab_control01.TabCount + 1);
clonedDGV.DataSource = exam_Results_Table;
newTab_page.Controls.Add(clonedDGV);
this.tab_control01.TabPages.Add(newTab_page);

Ответы [ 2 ]

4 голосов
/ 06 марта 2012

Вы определенно не хотите делать это:

clonedDGV = this.dataGridView1;

Эта строка не клонируется dataGridView1. Вместо этого он просто берет переменную clonedDGV и указывает на тот же объект сетки, на который указывает dataGridView1. Это означает, что если вы внесете какие-либо изменения в clonedDGV, вы также внесете их в dataGridView1. Помните, что в C # (почти) все переменные объекта на самом деле ссылаются на объекты, а не на сами объекты.

Не существует встроенного способа клонирования DataGridView в C #. Если все, что вы хотите сделать, это скопировать структуру в новую сетку, то вы можете сделать что-то вроде этого:

DataGridView clonedDGV = new DataGridView();
foreach(DataGridViewColumn col in this.dataGridView1.Columns) {
    clonedDGV.Columns.Add(new DataGridViewColumn(col.CellTemplate));
}

Это даст вам новую сетку с такой же структурой, но без каких-либо данных. Если вы тоже хотите скопировать данные, выполните цикл по строкам в исходной сетке и добавьте новые строки в новую сетку.

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

Редактировать: Если все, что вам нужно, это клонировать свойства вашей исходной сетки, вам придется делать всю работу самостоятельно. Если вы планируете делать это часто, я бы посоветовал вам создать метод расширения и сохранить всю свою логику. Примерно так:

public static class Extentions {
    public static DataTable Clone(this DataGridView oldDGV) {
        DataGridView newDGV = new DataGridView();

        newDGV.Size = oldDGV.Size;
        newDGV.Anchor = oldDGV.Anchor;

        return newDGV;
    }
}

Как только это будет создано, вы можете назвать его так:

DataGridView clonedDGV = dataGridView1.Clone();

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

2 голосов
/ 06 марта 2012

Вместо этого clonedDGV = this.dataGridView1 вам нужно просмотреть свойства и скопировать их по отдельности.В противном случае вы переустанавливаете clonedDGV, чтобы быть просто еще одной ссылкой на старую сетку данных.

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

...