Вы определенно не хотите делать это:
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();
Вам все равно придется написать строку кода для каждого важного для вас свойства, но, по крайней мере, ваша логика будет в одном месте.