Ordenar elementos del TreeView numericamente

30/07/2006 - 19:19 por neualex | Informe spam
Hola foro

Tengo una carpeta en la sgte. forma:

\Batches
- Batch 1
- Batch 2
- Batch 3
- Batch 10
- Batch 20
- Batch 21

Dicha carpeta la visualizo en un TreeView, pero este al agregar las carpetas
las agrega de esta forma:

\Batches
- Batch 1
- Batch 10
- Batch 2
- Batch 20
- Batch 21
- Batch 3

Quiero que el TreeView visualize las carpetas en order numerico. He probado
implementando la clase IComparer, pero no me resulta.

Alguien me puede dar una mano?
Gracias.

PS. Este es mi codigo:

Private Sub frmImageList_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load

Dim rootPath As String = "C:\Documents and Settings\Administrator\Desktop\"

Dim rootFolder As String = "Batches"

treeView.Nodes.Add(rootFolder)

populateTreeView(rootPath & rootFolder, treeView.Nodes(0))

End Sub



Private Sub populateTreeView(ByVal folderPath As String, ByVal parentNode As
TreeNode)

' populate current node with subfolders

Try

Dim myComparer As folderComparer = New folderComparer

' get all subfolders

Dim folderArray As String() = Directory.GetDirectories(folderPath)

Array.Sort(folderArray, myComparer)

' check if it has at least one subfolder

If (folderArray.Length <> 0) Then

Dim currentFolder As String

For Each currentFolder In folderArray

Dim folderName = Directory.CreateDirectory(currentFolder).Name

' creae a new node for current folder

Dim myNode = New TreeNode(folderName)

' add current folder node to parent node

parentNode.Nodes.Add(myNode)

' populate recursively every subfolder

populateTreeView(currentFolder, myNode)

Next

End If

Catch unAuthorizedEx As UnauthorizedAccessException

parentNode.Nodes.Add("Access to this folder is denied!")

End Try

End Sub

End Class



Public Class folderComparer

Implements IComparer

Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer _

Implements IComparer.Compare

Dim strX As String = x

Dim strY As String = y

Dim idx As Integer = strX.LastIndexOf("\") + 1

strX = strX.Substring(idx, strX.Length() - idx)

strY = strY.Substring(idx, strY.Length() - idx)

Return strX.CompareTo(strY)

End Function
 

Leer las respuestas

#1 Jose Luis
31/07/2006 - 18:43 | Informe spam
El problema lo tienes en que tienes que ordenarlo alfabéticamente ya que
mezclas letras y números, tal y como lo tienes se me ocurre que podrías
llamarlas:

\Batches
- Batch 01
- Batch 02
- Batch 03
- Batch 10
- Batch 20
- Batch 21

De esta manera se ordenarían como tu quieras, si deseas que sean tal y como
están, create un método de ordenación propio y haces un tratamiento previo,
es decir si siempre va a existir al principio la cadena Batch pues en tu
comparador la omites y simplemente evalúas los números p.Ej..

Este ejemplo es uno modificado levemente de uno usado en un listview, quizás
se tenga que modificar mas puesto que no he creado ningún método de
ordenación para TreeViews.

Public Class Ordenar_Columna
Implements IComparer
Public Function CompareTo(ByVal o1 As Object, ByVal o2 As Object) As
Integer Implements System.Collections.IComparer.Compare
Dim item1, item2 As ListViewItem
item1 = CType(o1, ListViewItem)
item2 = CType(o2, ListViewItem)
Dim num1, num2 As Integer

'Porque un substring, por que asumimos que la cadena de entrada
será siempre de Batch XXX, así que simplemente usamos el numero.
Try
num1 = CInt(item1.SubItems(0).Text.Substring(5,
item1.SubItems(0).Text.Length - 5))
Catch
Return 1
End Try

Try
num2 = CInt(item2.SubItems(0).Text.Substring(5,
item1.SubItems(0).Text.Length - 5))
Catch
Return -1
End Try

If num1 > num2 Then
Return 1
ElseIf num1 < num2 Then
Return -1
Else
Return 0
End If
End Function
End Class


Suerte.
"neualex" escribió en el mensaje
news:eseJcx$
Hola foro

Tengo una carpeta en la sgte. forma:

\Batches
- Batch 1
- Batch 2
- Batch 3
- Batch 10
- Batch 20
- Batch 21

Dicha carpeta la visualizo en un TreeView, pero este al agregar las
carpetas las agrega de esta forma:

\Batches
- Batch 1
- Batch 10
- Batch 2
- Batch 20
- Batch 21
- Batch 3

Quiero que el TreeView visualize las carpetas en order numerico. He
probado implementando la clase IComparer, pero no me resulta.

Alguien me puede dar una mano?
Gracias.

PS. Este es mi codigo:

Private Sub frmImageList_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load

Dim rootPath As String = "C:\Documents and
Settings\Administrator\Desktop\"

Dim rootFolder As String = "Batches"

treeView.Nodes.Add(rootFolder)

populateTreeView(rootPath & rootFolder, treeView.Nodes(0))

End Sub



Private Sub populateTreeView(ByVal folderPath As String, ByVal parentNode
As TreeNode)

' populate current node with subfolders

Try

Dim myComparer As folderComparer = New folderComparer

' get all subfolders

Dim folderArray As String() = Directory.GetDirectories(folderPath)

Array.Sort(folderArray, myComparer)

' check if it has at least one subfolder

If (folderArray.Length <> 0) Then

Dim currentFolder As String

For Each currentFolder In folderArray

Dim folderName = Directory.CreateDirectory(currentFolder).Name

' creae a new node for current folder

Dim myNode = New TreeNode(folderName)

' add current folder node to parent node

parentNode.Nodes.Add(myNode)

' populate recursively every subfolder

populateTreeView(currentFolder, myNode)

Next

End If

Catch unAuthorizedEx As UnauthorizedAccessException

parentNode.Nodes.Add("Access to this folder is denied!")

End Try

End Sub

End Class



Public Class folderComparer

Implements IComparer

Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer _

Implements IComparer.Compare

Dim strX As String = x

Dim strY As String = y

Dim idx As Integer = strX.LastIndexOf("\") + 1

strX = strX.Substring(idx, strX.Length() - idx)

strY = strY.Substring(idx, strY.Length() - idx)

Return strX.CompareTo(strY)

End Function


Preguntas similares