Newsgroup: it.comp.lang.visual-basic
Titolo: [VB.NET] Inserire nodo senza nome in una treeview

Ho una treeview che visualizza le dir di una determinata cartella.
Se voglio creare una nuova cartella nella treeview uso un pulsante che 
mi fa l'operazione e funziona:
System.IO.Directory.CreateDirectory(TreeView.SelectedNode.FullPath 
+ "\Test")
Io perï¿œ vorrei creare la cartella assegnando il nome dalla treeview!
Cioï¿œ vorrei aggiungere un nodo senza testo e scrivere dento il nome 
della directory e dopo l'invio eseguire l'operazione di creazione 
della dir.
Avete qualche spunto ?
Grazie, Alverman

Faccio che aggiungo un nodo con "Nuova cartella" ...... ï¿œ meglio :)

Si, ma come faccio se continuo a premere per creare una nuova cartella ?
Mi fermo a 2 :)
Potrei continuare all'infinito ma non mi sembra il caso
            If My.Computer.FileSystem.DirectoryExists
(TreeView.SelectedNode.FullPath + "\Nuova cartella") = True Then
                System.IO.Directory.CreateDirectory
(TreeView.SelectedNode.FullPath + "\Nuova cartella (2)")
            Else
                System.IO.Directory.CreateDirectory
(TreeView.SelectedNode.FullPath + "\Nuova cartella")
            End If
E' ?
Alverman

Penso di esserci vicino ma mi sto incriccando !!
            Dim subdirectoryEntries As String() = 
Directory.GetDirectories(TreeView.SelectedNode.FullPath)
            Dim dirCount As Integer = 0
            For Each subdirectory As String In subdirectoryEntries
                dirCount = +1
                If subdirectory = TreeView.SelectedNode.FullPath 
+ "\Nuova cartella" Then
                    My.Computer.FileSystem.CreateDirectory
(TreeView.SelectedNode.FullPath + "\Nuova cartella (" + 
dirCount.ToString + ")")
                Else
                    My.Computer.FileSystem.CreateDirectory
(TreeView.SelectedNode.FullPath + "\Nuova cartella")
                End If
            Next

Cosï¿œ sbra funzionare :)
           Dim subdirectoryEntries As String() = Directory.GetDirectories
(TreeView.SelectedNode.FullPath)
            Dim dirCount As Integer = 0
            If subdirectoryEntries.Length = 0 Then
                My.Computer.FileSystem.CreateDirectory
(TreeView.SelectedNode.FullPath + "\Nuova cartella")
            Else
                For Each subdirectory As String In subdirectoryEntries
                    Dim dirTot As Integer = subdirectoryEntries.Length
                    dirCount += 1
                    If subdirectory = TreeView.SelectedNode.FullPath 
+ "\Nuova cartella" And (dirCount) = subdirectoryEntries.Length Then
                        My.Computer.FileSystem.CreateDirectory
(TreeView.SelectedNode.FullPath + "\Nuova cartella (" + (dirCount + 
1).ToString + ")")
                    Else
                        If subdirectory = TreeView.SelectedNode.FullPath 
+ "\Nuova cartella (" + dirCount.ToString + ")" And (dirCount) = 
subdirectoryEntries.Length Then
                            My.Computer.FileSystem.CreateDirectory
(TreeView.SelectedNode.FullPath + "\Nuova cartella (" + (dirCount + 
1).ToString + ")")
                        End If
                    End If
                Next
            End If
Troppo macchinoso ?
Alverman

Ha molti difetti :(
Se esistono delle cartelle non ne crea di nuove
Quando aqggiungo le cartelle arrivo a 10 e non ne vengono + aggiunte.
Mah

 ha scritto nel messaggio 
news:201001151...@mynewsgate.net...

Per essere coerente col comportamento della shell di Windows secondo me 
dovresti procedere cosï¿œ:
1) quando si preme il tasto viene creata la directory chiamata "Nuova 
cartella" (o "Nuova cartella (2)" se esiste giï¿œ e cosï¿œ via)
Ho dato un'occhiata al tuo codice che dovrebbe gestire appunto questi casi.
Se posso darti un consiglio, la cosa migliore ï¿œ crearsi una funzione che 
dato il fullpath del nodo a cui va aggiunta la folder figlia, restituisce il 
nome giusto della nuova cartella, dopo aver verificato l'esistenza di 
cartelle omonime.
    Function GetNewFolderName(ByVal parentFolderPath As String) As String
        Dim newFolderName As String = "Nuova cartella"
        Dim baseFolderName = newFolderName
        Dim counter As Integer = 1
        If newFolderName.EndsWith(")") And newFolderName.Contains("(") Then
            ' Se presente, estrae il numero tra parentesi in coda al nome
            ' e la parte precedente
            If 
Integer.TryParse(newFolderName.Substring(newFolderName.LastIndexOf("(") + 
1).Remove(newFolderName.Length - 1, 1), counter) Then
                baseFolderName = 
newFolderName.Remove(newFolderName.LastIndexOf("("))
            End If
        End If
        With My.Computer.FileSystem
            Do While .DirectoryExists(.CombinePath(parentFolderPath, 
newFolderName))
                counter += 1
                newFolderName = baseFolderName & String.Format(" ({0})", 
counter)
            Loop
        End With
        Return newFolderName
    End Function
2) Una volta ottenuto il nome univoco della nuova cartella, la si crea nel 
filesystem e si aggiunge al treeview il relativo nodo che va posto in stato 
di edit attivato (il treeview deve avere LabelEdit=True) invocandone il 
metodo BeginEdit.
3) Infine nell'evento AfterLabelEdit del treeview si gestisce la rinomina 
della folder: se l'utente non ha premuto ESC (e.Cancel = False) e se ha 
effettivamente cambiato nome al nodo (e.Label <> e.Node.Text) allora si deve 
rinominare la cartella ad esso corrispondente ad esempio usando 
My.Computer.FileSystem.RenameDirectory, ovviamente gestendo opportunamente i 
casi di nomi di folder giï¿œ esistenti (o con try...catch oppure 
controllandoli preventivamente con FileSystem.DirectoryExists)
Bye
Raf 

Dopo mi studio il tuo eccellente consiglio :)
Nel frattempo posto questo che ha migliorato parecchio il risultato ma 
non del tutto preciso :)
        Dim subdirectoryEntries As String() = Directory.GetDirectories
(TreeView.SelectedNode.FullPath)
        Dim pointer As Integer = 0
        Dim NewFld As Boolean = False
        For Each subdirectory As String In subdirectoryEntries
            If subdirectory = TreeView.SelectedNode.FullPath + "\Nuova 
cartella" Then
                NewFld = True
            End If
            If subdirectory.Contains("Nuova cartella (") Then
                pointer += 1
            End If
        Next
        If pointer = 0 And NewFld = False Or pointer > 0 And NewFld = 
False Then
            My.Computer.FileSystem.CreateDirectory
(TreeView.SelectedNode.FullPath + "\Nuova cartella")
        Else
            My.Computer.FileSystem.CreateDirectory
(TreeView.SelectedNode.FullPath + "\Nuova cartella (" + (pointer + 
2).ToString + ")")
        End If
Grazie raf .... stasera ci provo

 ha scritto nel messaggio 
news:201001151...@mynewsgate.net...

Mi sono accorto che nella funzione che ho postato c'ï¿œ una parte che non 
serve a nulla (l'ho aggiustata da altro codice in cui era previsto che il 
nome della cartella nuova da creare potesse essere passato da fuori, e che 
quindi potesse giï¿œ contenere il suffisso "(numero)"), quindi la funzione si 
semplifica:
    Public Function GetNewFolderName(ByVal parentFolderPath As String) As 
String
        Dim newFolderName As String = "Nuova cartella"
        Dim baseFolderName = newFolderName
        Dim counter As Integer = 1
        With My.Computer.FileSystem
            Do While .DirectoryExists(.CombinePath(parentFolderPath, 
newFolderName))
                counter += 1
                newFolderName = baseFolderName & String.Format(" ({0})", 
counter)
            Loop
        End With
        Return newFolderName
    End Function
Ciao
Raf 

Porca vacca ..... 
Funziona alla grandissima 
Grazie ancora Raf
...... ne devo fare ancora della strada

Il codice che mi hai passato funziona egregiamente io ........ un po' di 
meno :)
Allora io per creare la directoy nella treeview prima creo la cartella e poi 
rinfresco la treeview.
Questo mi porta ad avere qualche problema quando voglio rinominare la 
directory dalla treeview perchï¿œ non conosco bene la storia del beginedit sui 
nodi.
Di fatti quando vado a rinominare un nodo e di conseguenza la directory, se 
non ricrostruisco la treeview il nodo rinominato rimane con il nome 
precedente.
Raf mi potresti spiegare un po come si usa beginedit e/o il modo di come 
rinominare una label della treeview ?
Grazie ancora, Alverman

 ha scritto nel messaggio 
news:201001152...@mynewsgate.net...

Secondo me non occorre rinfrescare tutto il treeview quando aggiungi una 
cartella nuova se nell'evento click del pulsante "crea cartella" hai questo 
codice:
        If TreeView1.SelectedNode IsNot Nothing Then
            Dim newFolderName As String = 
GetNewFolderName(TreeView1.SelectedNode.FullPath)
            Dim node As TreeNode = 
TreeView1.SelectedNode.Nodes.Add(newFolderName)
            My.Computer.FileSystem.CreateDirectory(node.FullPath)
            node.EnsureVisible()
            ' Mette il nodo in edit
            node.BeginEdit()
        End If
Per completare l'operazione (perchï¿œ magari l'utente vuole dare alla nuova 
cartella un nome diverso dal default), devi gestire l'evento AfterLabelEdit 
cosï¿œ:
    Private Sub TreeView1_AfterLabelEdit(ByVal sender As Object, ByVal e As 
System.Windows.Forms.NodeLabelEditEventArgs) Handles 
TreeView1.AfterLabelEdit
        ' Se il testo ï¿œ effettivamente stato cambiato
        If Not String.IsNullOrEmpty(e.Label) Then
            Dim newFolderName As String = e.Label
            Try
                My.Computer.FileSystem.RenameDirectory(e.Node.FullPath, 
newFolderName)
            Catch ex As Exception
                MessageBox.Show(ex.Message, "Impossibile rinominare la 
cartella", _
                                MessageBoxButtons.OK, MessageBoxIcon.Error)
                ' Annulla la modifica
                e.CancelEdit = True
                ' Rimette il nodo in edit
                e.Node.BeginEdit()
            End Try
        End If
    End Sub
Con questo evento gestisci anche il caso di rinomina manuale di una cartella 
anche giï¿œ esistente.
Bye
Raf 

Wow !!
Un'ultima cosa ...... spero  :)
Perchï¿œ quando creo una nuova cartella quando ci clicco sopra mi da un'errore 
sull'evento onmouseclick del nodo:
Object reference not set to an instance of an object.
Questo evento lo uso per visualizzare in una listview il contenuto della 
cartella.
Private Sub TreeView_NodeMouseClick(ByVal sender As Object, ByVal e As 
System.Windows.Forms.TreeNodeMouseClickEventArgs) Handles 
TreeView.NodeMouseClick
        ListView.Items.Clear()
        Dim nodeDirInfo As DirectoryInfo = CType(e.Node.Tag, DirectoryInfo)
        Dim subItems() As ListViewItem.ListViewSubItem
        Dim item As ListViewItem = Nothing
        txtFilePath.Text = e.Node.FullPath + "\" ' 
TreeView.SelectedNode.FullPath + "\" ' nodeDirInfo.FullName + "\"
        Dim file As FileInfo
        For Each file In nodeDirInfo.GetFiles() ******** QUI MI DA ERRORE 
*******
            Dim fname As String = e.Node.FullPath + "\" + file.Name ' 
txtFilePath.Text + file.Name
            item = New ListViewItem(file.Name, 1)
            subItems = New ListViewItem.ListViewSubItem() _
                {New ListViewItem.ListViewSubItem(item, "File"), _
                New ListViewItem.ListViewSubItem(item, _
                ConvertiByte(file.Length.ToString()))}
            item.SubItems.AddRange(subItems)
            'Debug.Print(ListView.Items.Count)
            If (ListView.Items.Count And 1) = 1 Then
                item.BackColor = Drawing.Color.White
            Else
                item.BackColor = Drawing.Color.LightYellow
            End If
            'ListView.Items.Add(item.Text, nIndex)
            ListView.Items.Add(item)
        Next file
        ListView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize)
    End Sub
Grazie ancora, Alverman

        Dim nodeDirInfo As DirectoryInfo = CType(e.Node.Tag, DirectoryInfo)
Hmmm... Perchï¿œ memorizzi nel tag del nodo un oggetto DirectoryInfo?
Magari per i nodi appena creati ï¿œ nothing?
Secondo me conviene che lo crei al volo di volta in volta quando appunto si 
clicca sul nodo.
Nell'evento NodeMouseClick:
    Dim nodeDirInfo = 
My.Computer.FileSystem.GetDirectoryInfo(e.Node.FullPath)
    For Each file As FileInfo In nodeDirInfo.GetFiles
    ...
Bye
Raf 

Lo stesso errore c'ï¿œ anche quando rinomino una dire e subito dopo ci clicco 
sopra.

 My.Computer.FileSystem.GetDirectoryInfo(e.Node.FullPath)
Esatto  !!
Grazie ancora Raf :)

Questa penso proprio sia la mia ultima richiesta !!
Ho una testbox nella form che visualizza il fullpath del nodo 
selezionato.
Se rinomino un nodo perï¿œ mi rimane il nome del nodo prima della modifica.
In che evento devo mettere:
 
txtFilePath.Text = ....
per avere sempre la textbox aggiornata al nodo selezionato ?
Alverman

Tutto OK !!
Grazie