【问题标题】:Cloning a GUI component克隆 GUI 组件
【发布时间】:2012-03-24 06:04:28
【问题描述】:

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

【问题讨论】:

  • 我不认为你会以这种方式到达你想要的地方......我将为这种网格创建一个数据模板并将其绑定到数据源(视图模型)。如果您的用户创建了一个新表(新数据源),您可以使用相同的数据模板将其绑定到一个新的网格实例。这会导致网格的“视觉克隆”,其中包含新数据。

标签: c# winforms datagridview clone


【解决方案1】:

你绝对不想这样做:

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

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

【讨论】:

  • 我很清楚这一点......但我现在只是在那里填写它只是为了看看我的代码是否有效......这是我需要更换的部分。它不是我要复制的列,而是组件属性,例如其设置大小、边界属性等。源/列完全不同
  • 没有内置的方法可以满足您的要求。您必须手动将新网格的每个属性设置为旧网格上该属性的值。
  • @ArjiSamosa 查看我的更新,以获取有关简化编码的快速建议。
【解决方案2】:

而不是这个clonedDGV = this.dataGridView1,您需要检查属性并单独复制它们。否则,您会将 clonedDGV 重置为对旧数据网格的另一个引用。

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

【讨论】:

    猜你喜欢
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 2015-02-12
    相关资源
    最近更新 更多