Reputation: 1201
I have a treeview that implements 2 types of items, folders and items. When I sort them I want the items to appear below the folders
like
folder a
subfolder a
subitem z
folder b
item a
item b
How can I modify my sort routines?
Public Class ascsorter
Implements Collections.IComparer
Public Function Compare(ByVal x As Object, ByVal y As Object) _
As Integer Implements Collections.IComparer.Compare
Dim tx As Windows.Forms.TreeNode = CType(x, Windows.Forms.TreeNode)
Dim ty As Windows.Forms.TreeNode = CType(y, Windows.Forms.TreeNode)
Return -String.Compare(tx.Text, ty.Text)
End Function
End Class
Public Class descsorter
Implements Collections.IComparer
Public Function Compare(ByVal x As Object, ByVal y As Object) _
As Integer Implements Collections.IComparer.Compare
Dim tx As Windows.Forms.TreeNode = CType(x, Windows.Forms.TreeNode)
Dim ty As Windows.Forms.TreeNode = CType(y, Windows.Forms.TreeNode)
Return String.Compare(tx.Text, ty.Text)
End Function
End Class
Upvotes: 1
Views: 1035
Reputation: 81620
You need to be able to distinguish between which nodes are folders and which nodes are items. The Tag
property can be used for this. In this example, I used "a" for folders and "b" for items:
Sample unsorted nodes with Tags:
Dim nodeA As New TreeNode("folder a") With {.Tag = "a"}
nodeA.Nodes.Add(New TreeNode("subitem z") With {.Tag = "b"})
nodeA.Nodes.Add(New TreeNode("subfolder a") With {.Tag = "a"})
nodeA.ExpandAll()
TreeView1.Nodes.Add(New TreeNode("folder b") With {.Tag = "a"})
TreeView1.Nodes.Add(nodeA)
TreeView1.Nodes.Add(New TreeNode("item b") With {.Tag = "b"})
TreeView1.Nodes.Add(New TreeNode("item a") With {.Tag = "b"})
TreeView1.TreeViewNodeSorter = New ascsorter
TreeView1.Sort()
And the updated Comparer which sorts the Tag property first:
Public Class ascsorter
Implements Collections.IComparer
Public Function Compare(ByVal x As Object, ByVal y As Object) _
As Integer Implements Collections.IComparer.Compare
Dim tx As Windows.Forms.TreeNode = CType(x, Windows.Forms.TreeNode)
Dim ty As Windows.Forms.TreeNode = CType(y, Windows.Forms.TreeNode)
If Not tx.Tag.Equals(ty.Tag) Then
Return String.Compare(tx.Tag, ty.Tag)
End If
Return String.Compare(tx.Text, ty.Text)
End Function
End Class
Note: No error checking if the Tag property was set or not.
Upvotes: 1