TreeNodeクラスは自分自身が展開されたか否かを知る能力がないが、TreeViewではそれを知ることが出来るので、展開されたノードに対して展開された事を通知させることができる。 これにより、ノードが展開されたときとそうでないときに表示されるアイコンを切り替えることができる TreeNodeの拡張クラスを紹介する。
ここで紹介するTreeNodeExクラスは、次の四つのプロパティでアイコンを変えることができる。
- ImageIndexプロパティ
 - 展開されていない場合で、かつ選択されていないとき
 - SelectedImageIndexプロパティ
 - 展開されていない場合で、かつ選択されているとき
 - ExpandedImageIndexプロパティ
 - 展開されている場合で、かつ選択されていないとき
 - ExpandedSelectedImageIndexプロパティ
 - 展開されている場合で、かつ選択されているとき
 
また、それぞれのノードに対して、展開されたとき(Expanded)と折り畳まれたとき(Collapsed)に呼び出されるイベントハンドラを割り当てられるようになっている。
拡張したTreeViewクラス
     ''' <summary>
''' 拡張ツリービュー
''' </summary>
Public Class TreeViewEx
    Inherits TreeView
    ''' <summary>
    ''' ノードが展開されたとき
    ''' </summary>
    Protected Overrides Sub OnAfterExpand(ByVal e As TreeViewEventArgs)
        If TypeOf e.Node Is TreeNodeEx Then DirectCast(e.Node, TreeNodeEx).OnExpanded(EventArgs.Empty)
        MyBase.OnAfterExpand(e)
    End Sub
    ''' <summary>
    ''' ノードが折り畳まれたとき
    ''' </summary>
    Protected Overrides Sub OnAfterCollapse(ByVal e As TreeViewEventArgs)
        If TypeOf e.Node Is TreeNodeEx Then DirectCast(e.Node, TreeNodeEx).OnCollapsed(EventArgs.Empty)
        MyBase.OnAfterCollapse(e)
    End Sub
End Class
      
     拡張したTreeNodeクラス
     ''' <summary>
''' 拡張ツリーノード
''' </summary>
Public Class TreeNodeEx
    Inherits TreeNode
#Region "ImageIndex"
    Private m_ImageIndex As Integer
    ''' <summary>
    ''' ツリーノードが選択されていない場合で、かつ展開されていないときに表示されるイメージのインデックス値
    ''' </summary>
    Public Overridable Shadows Property ImageIndex() As Integer
        Get
            Return m_ImageIndex
        End Get
        Set(ByVal Value As Integer)
            If m_ImageIndex <> Value Then
                m_ImageIndex = Value
                SetImageIndex()
            End If
        End Set
    End Property
    Private m_SelectedImageIndex As Integer
    ''' <summary>
    ''' ツリーノードが選択されている場合で、かつ展開されていないときに表示されるイメージのインデックス値
    ''' </summary>
    Public Overridable Shadows Property SelectedImageIndex() As Integer
        Get
            Return m_SelectedImageIndex
        End Get
        Set(ByVal Value As Integer)
            If m_SelectedImageIndex <> Value Then
                m_SelectedImageIndex = Value
                SetImageIndex()
            End If
        End Set
    End Property
    Private m_ExpandedImageIndex As Integer
    ''' <summary>
    ''' ツリーノードが選択されていない場合で、かつ展開されているときに表示されるイメージのインデックス値
    ''' </summary>
    Public Overridable Shadows Property ExpandedImageIndex() As Integer
        Get
            Return m_ExpandedImageIndex
        End Get
        Set(ByVal Value As Integer)
            If m_ExpandedImageIndex <> Value Then
                m_ExpandedImageIndex = Value
                SetImageIndex()
            End If
        End Set
    End Property
    Private m_ExpandedSelectedImageIndex As Integer
    ''' <summary>
    ''' ツリーノードが選択されている場合で、かつ展開されているときに表示されるイメージのインデックス値
    ''' </summary>
    Public Overridable Shadows Property ExpandedSelectedImageIndex() As Integer
        Get
            Return m_SelectedImageIndex
        End Get
        Set(ByVal Value As Integer)
            If m_ExpandedSelectedImageIndex <> Value Then
                m_ExpandedSelectedImageIndex = Value
                SetImageIndex()
            End If
        End Set
    End Property
    ' ImageIndexを設定する
    Private Sub SetImageIndex()
        If Me.IsExpanded Then
            MyBase.ImageIndex = m_ExpandedImageIndex
            MyBase.SelectedImageIndex = m_ExpandedSelectedImageIndex
        Else
            MyBase.ImageIndex = m_ImageIndex
            MyBase.SelectedImageIndex = m_SelectedImageIndex
        End If
    End Sub
#End Region
    ''' <summary>
    ''' ノードが展開されたときに発生するイベント
    ''' </summary>
    Public Event Expanded As EventHandler
    ''' <summary>
    ''' ノードが展開されたとき
    ''' </summary>
    Protected Friend Overridable Sub OnExpanded(ByVal e As EventArgs)
        SetImageIndex()
        RaiseEvent Expanded(Me, e)
    End Sub
    ''' <summary>
    ''' ノードが折りたたまれたときに発生するイベント
    ''' </summary>
    Public Event Collapsed As EventHandler
    ''' <summary>
    ''' ノードが折りたたまれたとき
    ''' </summary>
    Protected Friend Overridable Sub OnCollapsed(ByVal e As EventArgs)
        SetImageIndex()
        RaiseEvent Expanded(Me, e)
    End Sub
End Class