处理TreeNodes

时间:2012-07-17 19:10:08

标签: c# winforms

我派生了自定义TreeNode类型TreeNodeEx。在我的TreeNodeEx中,我订阅了NameChanged事件,其中包含一些分配给它的Value对象。此Value的生命周期长于树节点的生存期。

我的想法是,当删除树节点时,Value仍然通过事件处理程序委托引用树节点。所以这将保留对树节点的悬空引用。

TreeNode不是IDisposable,并且在TreeNode中没有要覆盖的事件或方法,以便知道何时删除它,因此,当我应该从事件中取消时。那么,我怎么知道何时解开?

class TreeNodeEx : TreeNode {
    private Foo m_value;
    public Foo Value {
        get { return m_value; }
        set {
            if (m_value != null) {
                m_value.NameChanged -= ValueNameChanged;
            }

            m_value = value;

            if (m_value != null) {
                m_value.NameChanged += ValueNameChanged;
            }
        }
    }

    private void ValueNameChanged(object sender, EventArgs e) {
        // ...
    }
}

1 个答案:

答案 0 :(得分:3)

用户无法自行删除节点,因此您在代码中的任何地方都应该处理treeView1.Nodes.Remove(...)处理您的处置职责。