2012-07-17 5 views
1

TreeNode 유형 TreeNodeEx을 파생 시켰습니다. 내 TreeNodeEx 있음, 그것에 할당 된 일부 값 개체 NameChanged 이벤트를 구독합니다. 이 값의 수명은 트리 노드의 수명보다 길다.트리 노드 처분

제 생각에 트리 노드가 제거 될 때 값에는 여전히 이벤트 처리기 대리인을 통해 트리 노드에 대한 참조가 있습니다. 그래서 이것은 트리 노드에 매달린 참조를 유지합니다. 따라서

TreeNodeIDisposable하지 않고, 그것을 제거 할 때 알고 TreeNode에 오버라이드 (override) 할 이벤트 나 방법이없는, 그리고, 나는 이벤트에서 풉니 다해야 할 때. 그래서, 어떻게 언 후크해야 하는지를 어떻게 알 수 있습니까?

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) { 
     // ... 
    } 
} 
+0

TreeView는 컬렉션 클래스로 설계되지 않았으므로 문자열을 표시 할 때만 유용합니다. 그것이 더 잘되도록 노력하는 것은 결코 잘되지 않습니다. 모델을보기와 구분하여 일반 TreeNode 만 사용하고 자신의 컬렉션 클래스에서해야하는 작업을 수행하십시오. –

+0

사용자가 노드를 단독으로 제거 할 수있는 방법이 없으므로 코드에서 treeView1.Nodes.Remove (...)를 호출하는 곳에서 처분 의무를 처리해야합니다. – LarsTech

+0

@LarsTech Duh. 그걸 한번 생각해 봤어? 대답 해 주면 받아 들일거야. –

답변

3

이 사용자가 스스로 노드를 제거 할 수있는 방법이 아니다, 그래서 당신은 treeView1.Nodes.Remove(...)를 호출하는 경우 이제까지 당신의 코드에서 당신이 당신의 처리 업무를 처리해야 할 때입니다.