可爱的【Web版】TreeNodeCollection

探讨了在使用TreeNodeCollection进行节点复制时遇到的问题。当从一个集合复制节点到另一个集合时,发现原集合中的节点被意外移除。深入研究了TreeNodeCollection.Add方法的实现,揭示了其内部机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

两个TreeNodeCollection,将其中一个的节点赋给另一个:
TreeNodeCollection a = new TreeNodeCollection();

TreeNodeCollection b = this.treeview.nodes;

foreach (TreeNode tn in b)
{
     a.Add(tn);

}
调试的时候发觉,在执行了a.Add(tn)之后,发觉b中的该节点没了,原以为节点最多指向同样的内存地址,
却没有想到竟然没了,查看相关源代码之后才发觉。。。原来Add方法会将其移除掉:

public void AddAt(int index, TreeNode child)
{
    if (child == null)
    {
        throw new ArgumentNullException("child");
    }
    if (this._updateParent)
    {
        if ((child.Owner != null) && (child.Parent == null))
        {
            child.Owner.Nodes.Remove(child);
        }
        if (child.Parent != null)
        {
            child.Parent.ChildNodes.Remove(child);
        }
        if (this._owner != null)
        {
            child.SetParent(this._owner);
            child.SetOwner(this._owner.Owner);
        }
    }
    this._list.Insert(index, child);
    this._version++;
    if (this._isTrackingViewState)
    {
        ((IStateManager) child).TrackViewState();
        child.SetDirty();
    }
    this.Log.Add(new LogItem(LogItemType.Insert, index, this._isTrackingViewState));
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值