展開されているときとされていない時でTreeNodeに表示されるアイコンを変える

注意:
この文書は以前「.NETでいきまっしょい!」で公開していたものですが、公開以降メンテナンスされていません。 今や古い情報となった内容が記載されている場合があるのでご注意ください。

TreeNodeクラスは自分自身が展開されたか否かを知る能力がないが、TreeViewではそれを知ることが出来るので、展開されたノードに対して展開された事を通知させることができる。 これにより、ノードが展開されたときとそうでないときに表示されるアイコンを切り替えることができるTreeNodeの拡張クラスを紹介する。

拡張されたTreeViewクラス
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
''' <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クラス
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
''' <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

TreeNodeExクラスは、

の四つのパターンについて表示するアイコンを変えることができる。 また、それぞれのノードに対して、展開されたとき(Expanded)と折り畳まれたとき(Collapsed)に呼び出されるイベントハンドラを割り当てられるようになっている。