2009-04-28 56 views
7

Este es un System.Windows.Forms.TreeView, no un WPF o Web TreeView.Carga diferida de TreeView en .NET

Debo extrañar algo, porque no puedo creer que esto sea tan difícil.

Tengo un TreeView en mi formulario. Cargar todos los datos para rellenar el TreeView es muy lento, por lo que quiero cargar solo los nodos de nivel superior y luego completar los secundarios a medida que el usuario amplía los nodos. El problema es que si un nodo no tiene hijos, no muestra el signo + al lado del nodo, lo que significa que no se puede expandir, lo que significa que no puedo capturar un evento desplegable para cargar los hijos .

Hace años, cuando estaba usando PowerBuilder, establecía una propiedad HasChildren (o similar) en true para esencialmente "mentir" al control y obligarlo a mostrar el + y luego podía capturar el evento desplegable. No he podido averiguar cómo forzar que aparezca un + en un nodo cuando no hay nodos secundarios.

He intentado un enfoque donde agrego un nodo ficticio a cada nodo y luego en la verificación de expansión si el nodo ficticio está presente y lo quito y luego cargo los niños, pero por diversas razones que no vale la pena entrar aquí esa solución no es viable en mi situación.

He buscado en Google varias combinaciones de C#, treeview, demorado, diferido, carga, fuerza, expansión y algunos otros términos que ahora se me escapan sin suerte.

P.S. Encontré el proyecto TreeViewAdv en SourceForge, pero prefiero no introducir un nuevo componente en nuestro entorno si puedo evitarlo.

+1

Siempre he usado el método de nodo ficticio; generalmente funciona bastante bien. ¿Puede decirnos más acerca de por qué no funcionará para usted? – Charlie

Respuesta

4

Cargar los primeros 2 niveles en el arranque y carga de 2 niveles hacia abajo cuando se expande un nodo.

0

Una posible solución es mantenerse un paso por delante de la vista de árbol:

private void Form1_Load(object sender, EventArgs e) 
{ 
    // initialise the tree here 
    var nodeSomething = treeView1.Nodes.Add("Something"); 
    nodeSomething.Nodes.Add("Something below something"); 

    treeView1.AfterExpand += AfterExpand; 
} 

private void AfterExpand(object sender, TreeViewEventArgs e) 
{ 
    foreach (TreeNode node in e.Node.Nodes) 
    { 
     // skip if we have already loaded data for this node 
     if (node.Tag != null) 
      continue; 
     node.Tag = new object(); 
     node.Nodes.AddRange(GetDataForThisNode(node)); 
    } 
} 
0

también me he preguntado cómo conseguir el + para mostrar al lado de los nodos sin hijos, pero nunca he encontrado una buena manera. Mi solución fue para controlar el evento MouseDoubleClick así:

Private Sub tvwMain_MouseDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles tvwMain.MouseDoubleClick 
    Dim oNode As TreeNode 

    oNode = tvwMain.GetNodeAt(e.X, e.Y) 

    If oNode IsNot Nothing Then 
     If oNode.Nodes.Count = 0 Then 
      'add children here 
     End If 
    End If 
End Sub 
2

Estoy de acuerdo con Chris, he tenido que hacer esto varían cosa. Cargue los nodos superiores y luego capture el evento click, asegúrese de que el clic estaba en un nodo seleccionado, y luego rellene el nodo, y luego, amplíelo.

Si es necesario tener el signo más, cargue los nodos superiores y coloque un nodo ficticio en él. Asegúrese de capturar el evento de clic o expandir, borre los nodos y luego vuelva a llenarlo.

+2

En segundo lugar la idea del nodo ficticio. Lo uso yo mismo y establezco la propiedad Tag a un valor específico para diferenciar los nodos ficticios "Cargando ..." de los demás. En BeforeExpand, compruebo la existencia del nodo ficticio y reemplazo los contenidos. Funciona bien para mí –

0

¿Ha intentado adjuntar sus adiciones de nodo en BeginUpdate() y EndUpdate() llamadas? Esto desactiva cualquier pintura y, como tal, le permite agregar una gran cantidad de nodos al TreeView sin demoras significativas.

MSDN: TreeView.BeginUpdate Method

+0

creo que el OP significaba que cargar los datos en sí (desde DB, por ejemplo) era lento, sin agregar los nodos de árbol, por lo que querían cargar los datos bajo demanda (cuando el usuario expande cada nodo de árbol). – Lucas

+0

Lucas comentario es correcto. TreeView se llena lo suficientemente rápido, está obteniendo datos lentos. –

0

Puede tener mejor suerte con TreeViewAdv (en sourceforge).

Cuestiones relacionadas