1

TreeNodeカスタムタイプを派生させましたTreeNodeEx。私のでは、それに割り当てられたいくつかの Value オブジェクトTreeNodeExのイベントをサブスクライブします。NameChangedこの値の存続期間は、ツリー ノードの存続期間よりも長くなります。

私の考えでは、ツリー ノードが削除されても、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) {
        // ...
    }
}
4

1 に答える 1

3

ユーザーが自分でノードを削除する方法はありません。そのため、コード内のどこを呼び出してtreeView1.Nodes.Remove(...)も、廃棄作業を処理する必要があります。

于 2012-07-17T19:55:07.730 に答える