Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente bannato
    Registrato dal
    Mar 2002
    Messaggi
    1,811

    vb.net caricamento treeview

    salve a tutti
    avrei unatreview da caricare ...
    avendo un seti di ddati di questi tipo:

    codice:
    categorie    sottocategorie
    ----------------------------
    catgoria1     sottoc1
    catgoria1     sottoc2
    catgoria2     sottoc1
    devo ccaricare ogni ramo per categoria e per ogniuno di questi inserire come ramo inferiore le categorie dipendenti
    del tipo
    codice:
    catgoria1
      + sottoc1
      + sottoc2
    catgoria2
      +sottoc1
    ho fatto un ciclo
    while
    res.read
    treeview1.node.add (nome categoria)
    e vadoa controllare quando la categoria cambia

    whle categoriaPrecedente = categoria
    treeview.nodes(x).add (sottocategoria)
    wend

    wend

    ma in questo modo mi perdo sempre qualche dato
    potete darmi un aiuto?
    grazie

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Riporta le parti significative del tuo codice, poichè in questo modo risulta difficile stabilire il punto in cui sbagli.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente bannato
    Registrato dal
    Mar 2002
    Messaggi
    1,811
    ecco il codice incriminato
    codice:
            'faccio il ciclo e se compare lo stesso nome metto i nodo
            While Res.Read
    
                Categoria = Trim(Res("DescCateg") & "")
                Raggruppamento = Trim(Res("descraggr") & "")
    
    
                TRW.Nodes.Add(New TreeNode(Categoria))
    
                If Raggruppamento <> "" And OldRaggruppamento <> Raggruppamento Then '(OldCategoria = Categoria)
                    Nodo = Nodo + 1
                    TRW.Nodes(i - 1).Nodes.Add(Raggruppamento)
                    TRW.Nodes(i - 1).Nodes(Nodo - 1).Tag = Res("codragrup") & ""
                    GoTo Continua
                    'se è la stessa categoria, aggiungo il raggruppamento e non aumento la i, in modo che mi va nello stesso nodo
                End If
    
                OldRaggruppamento = Raggruppamento
                TRW.Nodes.Item(i - 1).Tag = Trim("codcat") & ""
                i = i + 1
                ' continua il ragg e resta sullo stesso nodo
    continua:
            End While
            Res.Close()

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Sconsiglio vivamente l'uso di etichette e Goto, che rendono il blocco di codice poco leggibile e soprattutto non manifestano apertamente il ciclo che deve essere eseguito.

    Ad ogni modo, io ho creato nodi all'interno di un controllo TreeView in questo modo:
    codice:
    ' Blocca l'aggiornamento visuale del controllo
    demoTreeView.BeginUpdate()
    Try
    	' Elimina tutti i nodi presenti nella struttura
    	demoTreeView.Nodes.Clear()
    	' Esegue un ciclo di nodi genitori
    	Dim i As Integer
    	For i = 1 To 100
    		Dim parentNode As TreeNode = New TreeNode(i.ToString())
    		demoTreeView.Nodes.Add(parentNode)
    		' Esegue un ciclo per i nodi figli
    		Dim j As Integer
    		For j = 1 To 10
    			Dim childNode As TreeNode = New TreeNode(j.ToString())
    			parentNode.Nodes.Add(childNode)
    		Next
    	Next
    Finally
    	' Sblocca l'aggiornamento visuale del controllo
    	demoTreeView.EndUpdate()
    End Try
    Si tratta ovviamente di creare nodi non significativi, con valori di prova. A differenza del tuo codice, quando creo un nodo da aggiungere alla struttura, ne memorizzo il riferimento nella variabile parentNode: in questo modo, evito di ricercare nuovamente all'interno della struttura il nodo genitore per i nodi figli che mi sto accingendo a creare in modo analogo, i quali vengono poi inseriti nella proprietà Nodes del nodo padre parentNode.

    Questo principio si applica bene però se i dati giungono ordinati e suddivisi per categoria.

    Nel caso in cui tu abbia dati mescolati i quali vanno messi ognuno nel proprio nodo di appartenenza, ti basterebbe usare il nome delle categoria acquisito per individuare il relativo nodo e, una volta reperito il riferimento a tale nodo, utilizzare la proprietà Nodes per aggiungere i nodi figli. Esemplifico:
    codice:
    ' Blocca l'aggiornamento visuale del controllo
    demoTreeView.BeginUpdate()
    Try
    	' Elimina tutti i nodi presenti nella struttura
    	demoTreeView.Nodes.Clear()
    	' Esegue un ciclo per creare i nodi "genitori"
    	Dim i As Integer
    	Dim j As Integer
    	For i = 1 To 100
    		demoTreeView.Nodes.Add(New TreeNode("Nodo " + i.ToString()))
    	Next
    	' Esegue un ciclo per creare i nodi "figli"
    	For i = 1 To 100
    		Dim parentName As String
    		Dim parentNode As TreeNode
    		
    		' Cerca il nodo "padre"
    		' (meglio usare un Enumerator)
    		parentName = "Nodo " + i.ToString()
    		parentNode = Nothing
    		For j = 0 To demoTreeView.Nodes.Count - 1
    			If demoTreeView.Nodes(j).Text = parentName Then
    				parentNode = demoTreeView.Nodes(j)
    			End If
    		Next
    		
    		' Genera i nodi "figli"
    		If Not(parentNode Is Nothing) Then
    			For j = 1 To 10
    				parentNode.Nodes.Add("Figlio " + j.ToString())
    			Next
    		End If
    	Next
    Finally
    	' Sblocca l'aggiornamento visuale del controllo
    	demoTreeView.EndUpdate()
    End Try
    Non è il massimo delle performance, ma funziona.

    Concludendo, credo che la soluzione migliore sia quella di reperire i dati in forma già ordinata per categoria di appartenenza, in modo da poter aggiungere il nodo padre e, tenendo memorizzato un riferimento ad esso, aggiungere tutti i nodi figli per passare poi alla categoria e al rispettivo nodo padre successivi.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  5. #5
    Utente bannato
    Registrato dal
    Mar 2002
    Messaggi
    1,811
    si ho letto come intendi fare
    il punto è che ho difficolta nel caricare i nodi figli
    per quanto riguarda le sotto-categorie

    nel codice postato io faccio un ciclo while olcategoria = categoria e mando il datareader in avanti a leggere le sottocategorie

    ma in questo modo mi salta sempre qualche dato :master:

    cosa mi consiglieresti?
    grazie

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Originariamente inviato da amodio
    cosa mi consiglieresti?
    Nella query che utilizzi per il reperimento dei dati attraverso il DataReader, scrivi uno statement SQL che sia in grado di ordinare i dati raggruppandoli per categoria di appartenenza.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  7. #7
    Utente bannato
    Registrato dal
    Mar 2002
    Messaggi
    1,811
    Originariamente inviato da alka
    Nella query che utilizzi per il reperimento dei dati attraverso il DataReader, scrivi uno statement SQL che sia in grado di ordinare i dati raggruppandoli per categoria di appartenenza.
    si gia fatto!

  8. #8
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Originariamente inviato da amodio
    si gia fatto!
    In tal caso, se i dati sono ordinati correttamente, supponendo che distingui ogni categoria dall'altra in base al nome, crea un nodo "padre" per ogni categoria e usa il riferimento a tale nodo per creare i nodi figli attraverso la proprietà Nodes; ad ogni ciclo, controlla se la categoria cambia: in tal caso, crea un nuovo nodo "padre" e usalo per memorizzare i successivi nodi "figli" appartenenti a tale categoria.

    Se questo non è l'effetto che ottieni, significa che i dati non sono effettivamente ordinati come voluto oppure che nel codice sussistono altri tipi di errori. In entrambi i casi, esegui il debug passo per passo e verifica come si comporta il programma ad ogni record che deve essere trattato, identificando i motivi per cui, ad un certo punto, avviene il mescolamento. Se questo "mescolamento" avviene per un motivo non inerente all'ordinamento preventivo dei dati, eseguendo il programma un'istruzione alla volta sei senz'altro in grado di verificare il motivo.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.