【问题标题】:Clearing TreeView item ChildNodes also clears Parent reference?清除 TreeView 项 ChildNodes 也会清除父引用?
【发布时间】:2013-03-15 10:22:39
【问题描述】:

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

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

node.ChildNodes.Clear();

如果选中该节点的复选框,则在 Clear() 之后 node.Parent 为空。如果未选中,则 parent 仍然正确。我真的不明白为什么清除子节点集合也会清除我的父引用。我实际上没有在此调用中使用或修改选中的属性。我也 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!请善待,这是我的第一个问题......

【问题讨论】:

    标签: c# asp.net treeview


    【解决方案1】:

    下面是来自 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));
    }
    

    【讨论】:

    • 谢谢!这有点出乎意料,但它解释了会发生什么。
    猜你喜欢
    • 2016-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-04
    • 2019-09-20
    相关资源
    最近更新 更多