2013-10-01 2 views
1

У меня есть дерево, которое реализует 2 типа предметов, папок и предметов. Когда я сортирую их, я хочу, чтобы элементы появляются ниже папки.NET treeview сортировать по алфавиту по типу узла

как

folder a 
    subfolder a 
    subitem z 
folder b 
item a 
item b 

Как я могу изменить свои процедуры сортировки?

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 

ответ

1

Вы должны уметь различать, какие узлы являются папками, а какие - элементами. Свойство Tag можно использовать для этого. В этом примере я использовал «а» для папок и «б» для элементов:

Примеров несортированных узлов с тегами:

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() 

и обновленный Comparer, который сортирует свойство Tag первым:

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 

Примечание: проверка наличия тега не установлена.

+0

Да, я использую свойство 'Tag' для тонны таких вещей. tx, мне потребовалось бы много времени, чтобы выяснить это простое решение – aelgoa

Смежные вопросы