我需要一些帮助,因为我对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);
答案 0 :(得分:4)
你绝对不想这样做:
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();
您仍然需要为每个对您重要的属性编写一行代码,但至少您的逻辑将在一个位置。
答案 1 :(得分:2)
您需要查看属性并单独复制它们,而不是此clonedDGV = this.dataGridView1
。否则,您要将clonedDGV
重置为旧数据网格的另一个引用。
注意:除非设计为克隆,否则通常无法“克隆”对象。