我需要一些帮助,因为我是C#的新手。我基本上是在尝试克隆一个datagridview组件属性(行/列内容不同)。
基本上我有一个选项卡页控件...在运行时,如果用户想要添加另一个表,则会创建一个新页面,其中的新datagridview具有与现有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);
发布于 2012-03-07 02:05:28
你肯定不想这样做:
clonedDGV = this.dataGridView1;
这行代码不能克隆dataGridView1
。相反,它只获取变量clonedDGV
,并将其指向dataGridView1
所指向的同一网格对象。这意味着如果您对clonedDGV
进行了任何更改,您也将对dataGridView1
进行更改。请记住,在C#中,(几乎)所有对象变量实际上都是对对象的引用,而不是对象本身。
在C#中没有内置的方法来克隆DataGridView
。如果你想做的就是将结构复制到一个新的网格中,那么你可以这样做:
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();
您仍然需要为每个对您重要的属性编写一行代码,但至少您的逻辑将在一个地方。
发布于 2012-03-07 02:00:06
而不是这个clonedDGV = this.dataGridView1
,您需要遍历属性并逐个复制它们。否则,您将把clonedDGV
重置为对旧数据网格的另一个引用。
注意:通常不可能“克隆”对象,除非它被设计为克隆对象。
https://stackoverflow.com/questions/9589149
复制相似问题