克隆GUI组件

时间:2012-03-06 17:51:30

标签: c# winforms datagridview clone

我需要一些帮助,因为我对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);

2 个答案:

答案 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重置为旧数据网格的另一个引用。

注意:除非设计为克隆,否则通常无法“克隆”对象。