2008-12-24 19 views
8

¿Existe alguna manera fácil de agregar nodos a un control TreeView WinForms .NET donde los nuevos nodos que se agregan se insertan en el índice correcto para que toda la lista de nodos se ordene alfabéticamente? Casi teniendo el mismo resultado que TreeView.Sort().Clasificar TreeView automáticamente al agregar nodos

Tengo un TreeView que crece continuamente a un par de cientos de nodos. El usuario puede ver este TreeView en tiempo real a medida que crece. Preferiría simplemente insertar los nodos en el índice correcto, en lugar de llamar a TreeView.Sort() cada vez que se agrega un nodo.

¿Se puede hacer esto?

Respuesta

24

En winforms, puede simplemente configurar la propiedad .Sorted de TreeView en True.

Cuando Ordenada se establece en true, los objetos TreeNode se ordenan en orden alfabético por sus valores de las propiedades de texto . Siempre debe usar BeginUpdate y EndUpdate para mantener el rendimiento al agregar una gran cantidad de artículos a un TreeView ordenado. Cuando se cambia el texto de un nodo existente , debe llamar a Ordenar a recurrir a los elementos.

Ref MSDN

+8

Interesantemente (al menos para mí) es que la propiedad .Sorted no aparece en la lista de propiedades de VS para TreeView ni en Intellisense. Quizás es un descuido. Los documentos de MSDN, como usted señaló, lo mencionan claramente, pero muchas veces tiendo a "presionar la tecla de puntos" para acceder a las propiedades inicialmente y luego verifico los documentos si no veo lo que estoy buscando. Inicialmente pasé por alto esa propiedad ordenada y definitivamente hizo una diferencia en la eficacia de ordenar la lista. Fue mucho más rápido de configurar.Primero se ordena a verdadero que luego se llama a Sort(). – itsmatt

+1

Para mí, tampoco aparece en la lista de propiedades, pero la codificación manual también funciona: tree.Sorted = true –

+2

Utilice http://msdn.microsoft.com/en-us/library/system.windows.forms. treeview.treeviewnodesorter.aspx si desea establecer el clasificador –

5

¿Por qué no creas nuevas clases que heredan de TreeView y TreeNodeCollection? El nuevo TreeView usará su nuevo TreeNodeCollection y puede anular el método Add() del TreeNodeCollection para hacer lo que está sugiriendo.

El método tendría que: 1. Encontrar la posición correcta para insertar y 2. Insertar el nuevo nodo.

La implementación más trivial se repetirá en la colección hasta el thisNode.value<=newNode.value<nextNode.value. Luego inserte antes de nextNode.Index. Puede ver un aumento en el rendimiento si usa un algoritmo de búsqueda diferente, dependiendo del tamaño de la colección. (Algo parecido a una búsqueda binaria me viene a la mente.)

Nota: También podría simplemente crear un método de extensión en un TreeNodeCollection que haga lo mismo. Sin embargo, anulando el método Add() asegura que su TreeView es siempre ordenado. Crear solo un método de extensión puede conducir a resultados indefinidos si aún no está ordenado antes de su llamada AddIntoSorted().

+1

Esto podría haber cambiado fácilmente ya que su puesto es de 6 años de edad, pero parece que no puede subclase 'TreeNodeCollection' ahora. Tiene un [constructor con el modificador de acceso 'interno'.] (Http://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/TreeNodeCollection.cs) –

+2

@DarrenHale Interesante. Y molesto, ya que supongo que tendrás que reinventar la rueda y luego hacer que tu nuevo 'TreeView' use la nueva colección. Gracias por el aviso. –

Cuestiones relacionadas