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