C# 清除TreeView项子节点也会清除父引用?

C# 清除TreeView项子节点也会清除父引用?,c#,asp.net,treeview,C#,Asp.net,Treeview,我正在开发一个ASP.NET4.0Web应用程序,我正在使用TreeView控件。我有一个问题,我真的不明白为什么会这样。我有与树项目关联的复选框 如果未选中复选框,则一切正常,但当我执行以下行时: node.ChildNodes.Clear(); 如果选中该节点的复选框,则清除()后node.Parent为null。如果未选中,则父项仍然正确。我真的不明白为什么清除childnodes集合也会清除我的父引用。我实际上没有在这个调用中使用或修改checked属性。我还100%确定我的父节点也不

我正在开发一个ASP.NET4.0Web应用程序,我正在使用TreeView控件。我有一个问题,我真的不明白为什么会这样。我有与树项目关联的复选框

如果未选中复选框,则一切正常,但当我执行以下行时:

node.ChildNodes.Clear();
如果选中该节点的复选框,则清除()后node.Parent为null。如果未选中,则父项仍然正确。我真的不明白为什么清除childnodes集合也会清除我的父引用。我实际上没有在这个调用中使用或修改checked属性。我还100%确定我的父节点也不是我节点的子节点(如果选中或不选中,为什么会有所不同)

为了使代码按预期工作,我需要使用以下变通方法:

TreeNode[] checkedNodes = new TreeNode[tvResults.CheckedNodes.Count];
tvResults.CheckedNodes.CopyTo(checkedNodes, 0);
foreach (TreeNode checkedNode in checkedNodes) // Uncheck all nodes temporary.
    checkedNode.Checked = false;

node.ChildNodes.Clear(); // Now it is ok to clear and parent is "saved".

foreach (TreeNode checkedNode in checkedNodes) // Recheck all checked nodes again.
    checkedNode.Checked = true;
有人知道这个问题吗

谢谢, 马蒂亚斯


PS!请客气,这是我的第一个问题…

下面是ASP.NET
TreeNodeCollection.Clear中的代码(来自.NET 4.5)。如您所见,它会清除所有选中的节点,而不执行任何验证。因此,这是一个设计上的缺陷(而不是设计上的缺陷),而不是代码中的缺陷。我的建议是添加一个扩展方法来执行问题中列出的变通方法,以便您可以轻松地重用它

// System.Web.UI.WebControls.TreeNodeCollection
/// <summary>Empties the <see cref="T:System.Web.UI.WebControls.TreeNodeCollection" /> object.</summary>
public void Clear()
{
if (this.Count == 0)
{
    return;
}
if (this._owner != null)
{
    TreeView owner = this._owner.Owner;
    if (owner != null)
    {
        if (owner.CheckedNodes.Count != 0)
        {
            owner.CheckedNodes.Clear();
        }
        for (TreeNode treeNode = owner.SelectedNode; treeNode != null; treeNode = treeNode.Parent)
        {
            if (this.Contains(treeNode))
            {
                owner.SetSelectedNode(null);
                break;
            }
        }
    }
}
foreach (TreeNode current in this._list)
{
    current.SetParent(null);
}
this._list.Clear();
this._version++;
if (this._isTrackingViewState)
{
    this.Log.Clear();
}
this.Log.Add(new TreeNodeCollection.LogItem(TreeNodeCollection.LogItemType.Clear, 0, this._isTrackingViewState));
}
//System.Web.UI.WebControls.TreeNodeCollection
///清空对象。
公共空间清除()
{
如果(this.Count==0)
{
返回;
}
如果(此._所有者!=null)
{
TreeView owner=此。\u owner.owner;
如果(所有者!=null)
{
if(owner.CheckedNodes.Count!=0)
{
owner.CheckedNodes.Clear();
}
for(TreeNode TreeNode=owner.SelectedNode;TreeNode!=null;TreeNode=TreeNode.Parent)
{
if(此包含(treeNode))
{
owner.SetSelectedNode(空);
打破
}
}
}
}
foreach(此列表中的树节点当前)
{
current.SetParent(空);
}
这个._list.Clear();
这个;
如果(此为跟踪视图状态)
{
this.Log.Clear();
}
this.Log.Add(新的TreeNodeCollection.LogItem(TreeNodeCollection.LogItemType.Clear,0,this.\u isTrackingViewState));
}

谢谢!这是有点出乎意料的行为,但它解释了发生了什么。