You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将一个TreeView的节点复制到另一个TreeView中

TreeView节点完整迁移实现

下面针对WinForms和WPF两种常见UI框架,分别给出完整复制节点(含所有子节点)到目标TreeView的实现方法:

WinForms 实现

WinForms的TreeView节点为TreeNode类型,需通过递归遍历源节点的层级结构,逐个复制节点的文本、标签及其他属性,再添加到目标TreeView中。

核心步骤

  • 编写递归复制节点的辅助方法,处理单个节点及其所有子节点
  • 根据需求选择:清空目标TreeView后复制,或追加到目标TreeView现有节点中

代码示例

// 递归复制单个TreeNode及其所有子节点
private TreeNode CopyTreeNode(TreeNode sourceNode)
{
    // 复制源节点核心属性(可按需扩展Checked、ImageIndex等属性)
    TreeNode newNode = new TreeNode(sourceNode.Text)
    {
        Tag = sourceNode.Tag,
        Checked = sourceNode.Checked,
        ImageIndex = sourceNode.ImageIndex,
        SelectedImageIndex = sourceNode.SelectedImageIndex
    };

    // 递归复制子节点
    foreach (TreeNode childNode in sourceNode.Nodes)
    {
        newNode.Nodes.Add(CopyTreeNode(childNode));
    }

    return newNode;
}

// 执行迁移的方法
private void CopyTreeViewNodes(TreeView sourceTree, TreeView targetTree)
{
    // 可选:清空目标TreeView现有节点(不需要保留原有内容时启用)
    // targetTree.Nodes.Clear();

    // 遍历源TreeView所有根节点,逐个复制添加到目标TreeView
    foreach (TreeNode rootNode in sourceTree.Nodes)
    {
        targetTree.Nodes.Add(CopyTreeNode(rootNode));
    }
}

WPF 实现

WPF的TreeView分两种场景处理:手动添加TreeViewItem时需递归复制;使用数据绑定则直接复制数据源更高效。

场景1:手动添加TreeViewItem的情况

// 递归复制单个TreeViewItem及其子项
private TreeViewItem CopyTreeViewItem(TreeViewItem sourceItem)
{
    TreeViewItem newItem = new TreeViewItem
    {
        Header = sourceItem.Header,
        Tag = sourceItem.Tag
        // 按需复制IsExpanded、IsSelected等其他属性
    };

    // 递归复制子项
    foreach (object child in sourceItem.Items)
    {
        if (child is TreeViewItem childItem)
        {
            newItem.Items.Add(CopyTreeViewItem(childItem));
        }
        else
        {
            // 非TreeViewItem的数据对象,需克隆后添加
            newItem.Items.Add(CloneDataItem(child));
        }
    }

    return newItem;
}

// 辅助方法:克隆自定义数据对象(根据实际类型实现)
private object CloneDataItem(object item)
{
    if (item is MyCustomData data)
    {
        return new MyCustomData
        {
            Property1 = data.Property1,
            Property2 = data.Property2
        };
    }
    // 基础类型直接返回
    return item;
}

// 执行迁移
private void CopyTreeViewItems(TreeView sourceTree, TreeView targetTree)
{
    // 可选:清空目标TreeView
    // targetTree.Items.Clear();

    foreach (object rootItem in sourceTree.Items)
    {
        if (rootItem is TreeViewItem rootTreeItem)
        {
            targetTree.Items.Add(CopyTreeViewItem(rootTreeItem));
        }
        else
        {
            targetTree.Items.Add(CloneDataItem(rootItem));
        }
    }
}

场景2:数据绑定的情况

如果TreeView通过ItemsSource绑定到集合(如ObservableCollection<MyNode>),直接复制数据源即可:

// 假设源TreeView绑定sourceNodes,目标绑定targetNodes
// 可选:清空目标集合
targetNodes.Clear();
// 逐个克隆源节点并添加到目标集合
foreach (var node in sourceNodes)
{
    targetNodes.Add(CloneNode(node));
}

// 克隆自定义节点的方法
private MyNode CloneNode(MyNode sourceNode)
{
    MyNode newNode = new MyNode
    {
        Name = sourceNode.Name,
        // 复制其他属性
    };
    // 递归复制子节点
    foreach (var child in sourceNode.Children)
    {
        newNode.Children.Add(CloneNode(child));
    }
    return newNode;
}

内容的提问来源于stack exchange,提问作者Steve

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 16:55:27