清除TreeView项ChildNodes是否也清除父引用?

时间:2013-03-15 10:22:40

标签: c# asp.net treeview

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

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

node.ChildNodes.Clear();

如果选中该节点的复选框,则在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;

对此问题有任何想法?

谢谢, 的Mattias

PS!请善待,这是我的第一个问题...

1 个答案:

答案 0 :(得分:0)

以下是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));
}