Visualizzazione dei risultati da 1 a 6 su 6

Discussione: Treeview da file txt

  1. #1

    Treeview da file txt

    Buongiorno a tutti,
    ho un problema con il popolamento di una treeview in VB 2012 Express. Vi spiego in dettaglio.
    Ho un file .txt con delle righe fatte così:

    primo|primoA|primoAA|primoAAA
    primo|primoA|primoAA|primoAAB
    primo|primoA|primoAB
    primo|primoB

    Leggo il file riga per riga e splitto ogni riga in un array di string, ottenendo, quindi, un array del tipo:
    primo
    primoA
    primoAA
    primoAAA

    Ciascuno degli elementi deve diventare un nodo della treeview così da popolarla come segue:
    primo
    -primoA
    --primoAA
    ---primoAAA

    La seconda riga, avendo gli stessi nodi della prima, popolerà solo l'ultimo nodo della treeview che, alla fine, diventerà:
    primo
    -primoA
    --primoAA
    ---primoAAA
    ---primoAAB
    --primoAB
    -primoB

    Il problema è che non riesco ad implementare i nodi oltre il primo figlio, perché in un ciclo ricorsivo, quando punto il nodo precedente mi dice che l'indice non è compreso nell'intervallo. Io ho fatto così:

    linee = IO.File.ReadAllLines(percorso & nomefile.txt)
    scomponi = Split(linee(0),"|") 'ottengo la scomposizione della prima linea del file
    While i < UBound(scomponi)

    If i = 0 Then

    treeview.Nodes.Add(scomponi(i))
    treeview.Nodes(i).Nodes.Add(scomponi(i + 1))
    i = i + 1
    Else
    trw_todo.Nodes(i).Nodes.Add(scomponi(i + 1)) 'riga 1
    end if
    End While

    In pratica, al primo passaggio inserisco il nodo root ed il primo figlio, dal secondo passaggio in poi, vorrei selezionare il padre precedente ed inserire il nuovo figlio, ma il ciclo mi torna appunto l'errore alla 'riga 1 dicendo che l'indice "i" non è compreso nell'intervallo, come se la treeview non fosse aggiornata dopo l'inserimento dei primi 2 nodi. Ho provato in tutti i modi, creando una lista che potesse contenere la descrizione dell'albero da inserire ma non funziona, oppure cercando ogni singolo nodo con una funzione che ne cerchi il nome... tutte le volte si pianta il ciclo!
    Qualcuno ha un'idea di come procedere?
    Ho trovato anche altri modi di implementare la funzione nodes.add sull'msdn che consentono di specificare il nodo figlio, tipo questa:

    tvwMyTree.Nodes.Add "7 node", tvwChild, "11 node"

    ma sul mio vb 2012 express questa modalità di implementare la Add non c'è!

    Qualcuno ha idea di come si potrebbe procedere?

    Grazie 1000 a tutti!




  2. #2
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Potresti usare una funzione ricorsiva.

    Ma perché chiami il treeview con tre nomi differenti?
    - treeview
    -
    trw_todo
    - tvwMyTree

  3. #3
    Quote Originariamente inviata da gibra Visualizza il messaggio
    Potresti usare una funzione ricorsiva.

    Ma perché chiami il treeview con tre nomi differenti?
    - treeview
    -
    trw_todo
    - tvwMyTree
    Grazie per la risposta. Il nome in realtà è sempre lo stesso, cioè treeview, solo che ho copiato pezzi di codice e mi sono dimenticato di cambiarlo, ma l'albero è sempre quello. La funzione ricorsiva ho provato a scriverla ma in realtà funziona al contrario, ossia se ho già un albero costruito posso scorrerlo tutto con una funzione ricorsiva, ma se lo devo implementare la funzione ricorsiva andrebbe ad agire su un albero che ancora non c'è.

  4. #4
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Ovviamente non è esatto quello che affermi.
    Però finché non mostri il codice della funzione ricorsiva, ed il codice che mostri è preso 'a pezzi ' qua e la, non so su cosa si possa discutere.

  5. #5

    Treeview da file txt

    Quote Originariamente inviata da gibra Visualizza il messaggio
    Ovviamente non è esatto quello che affermi.
    Però finché non mostri il codice della funzione ricorsiva, ed il codice che mostri è preso 'a pezzi ' qua e la, non so su cosa si possa discutere.
    Scusate il ritardo ma sono stato fuori per qualche giorno. Allora:

    ho scritto la procedura che si attiva quando premo il pulsante e la funzione ricorsiva richiamata per ricostruire l'albero. Ma non funziona!

    Private Sub btn_apri_Click(sender As Object, e As EventArgs) Handles btn_apri.Click
    Dim linee As String(), scomponi() As String
    linee = IO.File.ReadAllLines(percorso_file & prova1.Text))
    For i As Integer = 0 To linee.Count - 1
    'dentro scomponi ho tutti i campi separati
    scomponi = Split(linee(i), "|")
    'il primo valore della prima linea è la prima root, la inserisco direttamente
    If i = 0 Then trw_todo.Nodes.Add(scomponi(0))
    For k = 1 To UBound(scomponi) - 1
    'scorre l'albero per trovare il nodo corrente
    Dim nodo_sel As TreeNode = getNodeByVal(trw_todo.Nodes, scomponi(k))
    nodo_sel.Nodes.Add(scomponi(k + 1))
    Next
    Next
    End sub

    'Funzione che cerca il nome del nodo. Se lo trova lo restituisce
    Public Function getNodeByVal(ByVal nodes As TreeNodeCollection, ByVal text As String) As TreeNode
    Dim node As New TreeNode()
    For i As Integer = 0 To nodes.Count Step 1
    If nodes(i).Text.Equals(text) Then
    node = nodes(i)
    Exit For
    End If
    getNodeByVal(nodes(i).Nodes, text)
    Next
    Return node
    End Function

    Il file prova1.txt ha la struttura già indicata in precedenza, che riporto per completezza:

    primo|primoA|primoAA|primoAAA
    primo|primoA|primoAA|primoAAB
    primo|primoA|primoAB
    primo|primoB

    La funzione dovrebbe trovare il nodo in base al suo nome e restituirlo alla procedura di pressione pulsante, la quale aggiunge il figlio successivo. Al primo ciclo si blocca perché non trova il nodi "i-esimo", come se l'albero trw_todo non si aggiornasse in tempo reale. Qualcuno ha un'idea?
    Grazie 1000!.

  6. #6
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Scusa ma devi leggere il Regolamento. Il tuo codice è illeggibile.

Tag per questa discussione

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.