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