2009-04-28 13 views
7

Questo è un System.Windows.Forms.TreeView, non un WPF o Web TreeView.Caricamento differito di TreeView in .NET

Mi manca qualcosa, perché non posso credere che sia così difficile.

Ho una vista ad albero sul mio modulo. Caricamento di tutti i dati per popolare TreeView è molto lento, quindi voglio caricare solo i nodi di livello superiore e quindi compilare i bambini mentre l'utente espande i nodi. Il problema è che se un nodo non ha figli, non visualizza il segno + accanto al nodo, il che significa che non può essere espanso, il che significa che non è possibile acquisire un evento espandibile per caricare i bambini .

Anni fa, quando stavo usando PowerBuilder, si impostava una proprietà HasChildren (o simile) a true per essenzialmente "mentire" sul controllo e lo si forza per visualizzare il segno + e si potrebbe quindi acquisire l'evento Espansione. Non sono stato in grado di capire come forzare un + a comparire su un nodo quando non ci sono nodi figli.

Ho provato un approccio in cui aggiungo un nodo fittizio a ciascun nodo e quindi in espansione verifica se il nodo fittizio è presente e lo rimuovi quindi carico i bambini, ma per vari motivi che non vale la pena di entrare qui questa soluzione non è praticabile nella mia situazione.

Ho cercato su Google varie combinazioni di C#, treeview, ritardo, differimento, carico, forza, espansione e alcuni altri termini che mi sfuggono ora senza fortuna.

P.S. Ho trovato il progetto TreeViewAdv su SourceForge, ma preferirei non introdurre un nuovo componente nel nostro ambiente se posso evitarlo.

+1

Ho sempre utilizzato il metodo del nodo fittizio; generalmente funziona abbastanza bene. Puoi dirci di più sul perché non funzionerà per te? – Charlie

risposta

4

carico i primi 2 livelli all'avvio e carico 2 livelli giù quando un nodo è espanso.

0

Una soluzione possibile è quella di rimanere un passo avanti rispetto alla vista ad albero:

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

Ho anche chiesto come ottenere il + per mostrare accanto a nodi senza figli, ma non ho mai trovato un buon modo. La mia soluzione era di gestire l'evento MouseDoubleClick in questo modo:

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

Sono d'accordo con Chris, ho dovuto fare questo variare la cosa. Caricare i nodi superiori e quindi acquisire l'evento click, assicurarsi che il clic si trovasse su un nodo selezionato, quindi compilare il nodo e infine espanderlo.

Se è necessario avere il vantaggio, quindi caricare i nodi superiori e inserire un nodo fittizio in esso. Assicurati di acquisire l'evento click o expand, cancella i nodi e poi ripopola.

+2

I secondo l'idea del nodo fittizio. Lo sto utilizzando io stesso e impostando la proprietà Tag su un valore specifico per differenziare i nodi fittizi "Caricamento in corso ..." degli altri. In BeforeExpand, controllo l'esistenza del nodo fittizio e sostituisco il contenuto. Funziona bene per me. –

0

Avete provato a includere le aggiunte del nodo nelle chiamate BeginUpdate() e EndUpdate()? Ciò disabilita qualsiasi disegno e come tale consente di aggiungere un numero elevato di nodi a TreeView senza ritardi significativi.

MSDN: TreeView.BeginUpdate Method

+0

penso che l'OP significasse che caricare i dati stessi (dal DB, ad esempio) era lento, non aggiungendo i nodi dell'albero, quindi vogliono caricare i dati su richiesta (quando l'utente espande ciascun nodo dell'albero). – Lucas

+0

Il commento di Lucas è corretto. TreeView si compila abbastanza velocemente, sta ottenendo i dati che è lento. –

0

È possibile avere maggiore fortuna utilizzando TreeViewAdv (su sourceforge).