Click here to Skip to main content
15,888,610 members
Articles / Programming Languages / Visual Basic
Article

TreeView Style Modifiers

Rate me:
Please Sign up or sign in to vote.
3.25/5 (6 votes)
13 Jan 2006CPOL1 min read 49.2K   482   20   2
TreeView styles can be changed and customized with the help of these code snippets.

Introduction

This is my first article posting in this site. The code snippets illustrated here will be help to customize your TreeView control in VB.NET. Here, I have tried out two things that can be done when selecting a node - first to blink the node with the help of a Timer control, and second, sort the node with its subtree nodes.

Concept

While we are working with most VB.NET controls, it is very easy to provide a good and easy-to-use presentation. But if we are working on a control like TreeView, we may face some difficulties. To overcome those issues, these code snippets will be helpful in a big way. Here, I like to focus on two things, one is how a Timer control is used and is used separately in another class for more flexibility, and how an individual node can be blinked.

Using the code

Create a new form and add a TreeView control. Apply these initial settings for the TreeView control and the Button controls in the form:

VB
'
'TreeView_C
'
Me.TreeView_C.ImageIndex = -1
Me.TreeView_C.Location = New System.Drawing.Point(10, 10)
Me.TreeView_C.Name = "TreeView_C"
Me.TreeView_C.Nodes.AddRange(New System.Windows.Forms.TreeNode() _
  {New System.Windows.Forms.TreeNode("Root Node", _
   New System.Windows.Forms.TreeNode() _
  {New System.Windows.Forms.TreeNode("Fruits", _
   New System.Windows.Forms.TreeNode() _
  {New System.Windows.Forms.TreeNode("Apple"), _
   New System.Windows.Forms.TreeNode("Orange"), _
   New System.Windows.Forms.TreeNode("Pineapple"), _
   New System.Windows.Forms.TreeNode("Grapes")}), _
   New System.Windows.Forms.TreeNode("Animals", _
   New System.Windows.Forms.TreeNode() _
  {New System.Windows.Forms.TreeNode("Lion"), _
   New System.Windows.Forms.TreeNode("Tiger")})})})
Me.TreeView_C.SelectedImageIndex = -1
Me.TreeView_C.Size = New System.Drawing.Size(240, 250)
Me.TreeView_C.TabIndex = 0
'
'btnApplyColors
'
Me.btnApplyColors.Location = New System.Drawing.Point(10, 265)
Me.btnApplyColors.Name = "btnApplyColors"
Me.btnApplyColors.Size = New System.Drawing.Size(80, 30)
Me.btnApplyColors.TabIndex = 1
Me.btnApplyColors.Text = "Apply Colors"
'
'btnSort
'
Me.btnSort.Location = New System.Drawing.Point(175, 265)
Me.btnSort.Name = "btnSort"
Me.btnSort.Size = New System.Drawing.Size(70, 30)
Me.btnSort.TabIndex = 2
Me.btnSort.Text = "Sort"
'
'btnBlinking
'
Me.btnBlinking.Location = New System.Drawing.Point(90, 265)
Me.btnBlinking.Name = "btnBlinking"
Me.btnBlinking.Size = New System.Drawing.Size(80, 30)
Me.btnBlinking.TabIndex = 3
Me.btnBlinking.Text = "Blinking"

The code below is used to control events:

VB
Dim sortedAsc As Boolean = False
Dim BlinkingNodes As String = ""
Dim cnode As New TreeNode
Public Enum SortOrder
    Ascending
    Descending
End Enum

Private Sub btnApplyColors_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles btnApplyColors.Click
    TreeView_C.SelectedNode.ForeColor = Color.Pink
End Sub

Private Sub btnSort_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles btnSort.Click
    TreeView_C.SelectedNode.ForeColor = _
               TreeView_C.DefaultForeColor
    cnode = TreeView_C.SelectedNode
    If sortedAsc = False Then
        SortNode(SortOrder.Ascending)
        sortedAsc = True
    Else
        SortNode(SortOrder.Descending)
        sortedAsc = False
    End If
End Sub
Private Sub btnBlinking_Click(ByVal sender As System.Object, _
            ByVal e As System.EventArgs) Handles btnBlinking.Click
    If BlinkingNodes.IndexOf(TreeView_C.SelectedNode.Text) < 0 Then
        Dim obj As New BlinkTimer
        obj.cnode = TreeView_C.SelectedNode
        obj.cnode.ForeColor = TreeView_C.DefaultForeColor
        obj.timer_c.Start()
        BlinkingNodes = BlinkingNodes & ", _
                        " & TreeView_C.SelectedNode.Text
    End If
End Sub

The sample function below sorts its subtree nodes on the selected base nodes:

VB
Public Function SortNode(ByVal so As SortOrder)
    Dim retTreenode As New TreeNode
    Dim sSortString As String()
    Dim iLoop, jLoop As Integer
    ReDim sSortString(cnode.GetNodeCount(False) - 1)
    retTreenode= cnode.Clone
    For iLoop= 0 To sSortString.Length - 1
        sSortString(iLoop) = cnode.Nodes(iLoop).Text
    Next
    If so = SortOrder.Ascending Then
        sSortString.Sort(sSortString)
    Else
        sSortString.Reverse(sSortString)
    End If
    For iLoop= cnode.GetNodeCount(False) - 1 To 0 Step -1
        cnode.Nodes(iLoop).Remove()
    Next
    For jLoop= 0 To sSortString.Length - 1
        For iLoop= 0 To retTreenode.GetNodeCount(False) - 1
            If sSortString(jLoop).Trim = _
                    retTreenode.Nodes(iLoop).Text Then
                retTreenode.Nodes(iLoop).ForeColor = _
                      TreeView_C.DefaultForeColor
                cnode.Nodes.Add(retTreenode.Nodes(iLoop))

            End If
        Next
    Next
End Function

The sample class below is used internally to blink a selected node:

VB
Public Class BlinkTimer
    Public cnode As TreeNode
    Public timer_c As New timer
    Dim BlinkColor As Color = Color.DeepPink
    Public Sub New()
        AddHandler timer_c.Tick, AddressOf BlinkOn
    End Sub
    Public Sub BlinkOn(ByVal sender As System.Object, _
                       ByVal e As System.EventArgs)
        If cnode.ForeColor.ToString <> BlinkColor.ToString _
                 And cnode.ForeColor.ToString <> _
                 Color.Transparent.ToString Then
            cnode.ForeColor = Color.Transparent
        End If
        If cnode.ForeColor.ToString = Color.Transparent.ToString _
                 Or cnode.ForeColor.ToString = _
                 Color.Empty.ToString Then
            cnode.ForeColor = BlinkColor
        ElseIf cnode.ForeColor.ToString = _
               BlinkColor.ToString Then
            cnode.ForeColor = Color.Transparent
        End If
    End Sub
End Class

Points of Interest

On working with the Timer control, it is better to assign a Timer control in a separate class and access it, instead of assigning it to a control, since the Timer control can be accessed with a single instance and used multiple times.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Web Developer
India India
IT Professional

Comments and Discussions

 
GeneralBug found Pin
Sam Cartner22-Nov-06 1:56
Sam Cartner22-Nov-06 1:56 
GeneralWarning: Release Handlers Pin
AllanNielsen18-Jan-06 19:35
AllanNielsen18-Jan-06 19:35 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.