【问题标题】:Copy TreeView node with object tag复制带有对象标记的 TreeView 节点
【发布时间】:2015-07-09 18:58:44
【问题描述】:

我有一个TreeView。它的 TreeNodes 有一个 TreeNode.Tag 类型为 InfoForNode 的属性。它包含字段public DataGridViewRow[] Properties,我在其中存储有关节点的所有信息。

现在我想复制这个节点(以及来自Node.Tag 的所有属性)并将其粘贴到同一个TreeView 中。我尝试使用TreeNode.Clone() 方法:

foreach (var node in TreeQuery.SelectedNodes)
            {
                _copiedNodes.Add((TreeNode)node.Clone());
            }

它可以工作,但是复制的节点和原始节点指向 DataGridViewRow[] Properties 的同一个实例(因为它是引用类型,而 Clone() 执行节点的浅拷贝)。

请解释一下,在这种情况下我怎样才能获得正确的副本?

【问题讨论】:

    标签: c# treeview clone


    【解决方案1】:

    最简单的方法是手动完成。

            foreach (var node in TreeQuery.SelectedNodes)
            {
                TreeNode newNode = (TreeNode)node.Clone();
                DataGridView[] oldProperties = (DataGridView[])node.Tag;
                DataGridView[] newProperties = new DataGridView[oldProperties.Length];
                for(int i = 0; i < oldProperties.Length; i++)
                {
                    newProperties[i] = oldProperties[i].Clone(); //or whatever copy method works for this
                }
                _copiedNodes.Add(newNode);
            }
    

    这使您可以完全控制如何复制标签数据。

    【讨论】:

    • 首先,DataGridView 没有Clone() 方法。其次,TreeNode.Tag 具有以下字段:string Errorint IdDataGridView[] Propertiesstring Queryint ResultFunctionstring TableNamestring Where。因此DataGridView[] oldProperties = (DataGridView[])node.Tag 会导致错误。无论如何,谢谢你的回答。
    • Treenode 接受要设置的单个对象。因此,您必须有一个包含所有这些内容的类。因此,不要执行 (DataGridView[])node.Tag,而是执行 (CustomClass)node.Tag 并分离出您想要的 datagridview 数据。如果您只是尝试复制行值,那么您将不得不深入研究 datagridview 并手动执行此操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    • 2014-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多