克隆GUI组件

本文关键字:组件 GUI 克隆 | 更新日期: 2023-09-27 18:27:01

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

克隆GUI组件

您绝对不想这样做:

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();

您仍然需要为每个对您重要的属性编写一行代码,但至少您的逻辑将在一个地方。

您需要遍历属性并分别复制它们,而不是使用clonedDGV = this.dataGridView1。否则,您将重置clonedDGV,使其成为对旧数据网格的另一个引用。

注意:通常不可能"克隆"对象,除非它被设计为克隆对象。