Treeview nodes. clé [Résolu]

Signaler
Messages postés
493
Date d'inscription
jeudi 27 mars 2014
Statut
Membre
Dernière intervention
26 décembre 2020
-
Messages postés
493
Date d'inscription
jeudi 27 mars 2014
Statut
Membre
Dernière intervention
26 décembre 2020
-
Bonjour,

Mon objectif est de créer un nœud enfant avec une clé spécifique en sélectionnant le nœud parent dans mon treeview
TreeViewToolBox
en utilisation ce code ci -dessous:

 Dim StatusDate As String
                StatusDate = InputBox("Saisir le Nom du dossier que vous voulez créer dans " & fils.Text)
                If StatusDate = "" Then
                    MsgBox("Vous devez saisir un Nom.")
                    Exit Sub
                Else        
                Dim trace As String = System.DateTime.Now.ToString("ddMMyyyy" & "HHmmss")
                ' Add(Of String, String)
                Dim newNode As New TreeNode With {.nom = trace, .Text = StatusDate}         
                TreeViewToolBox.SelectedNode.Nodes.Add(newNode)
                Me.Textkey.Text = newNode.nom

  End If
            End If



Dans mon code j'attribue une clé spécifique (trace) à chaque nœud enfant créé.
Ce procédé fonctionne sur le coup car quand je sélectionne le nœud enfant que je viens de créer j'obtiens bien le text
trace
avec ce code
MsgBox(TreeViewToolBox.SelectedNode.nom)
.

Jusqu'ici pas de souci .
Mon treeview est stocké dans une base qui se charge à l'ouverture du Form.

  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
 Dim conn = New SQLiteConnection("Data Source=BDD.s3db;Version=3")
        Try
            Using (conn)
                conn.Open()
                Dim sql = "Select * FROM ARBORESCENCE"
                Dim cmdDataGrid As SQLiteCommand = New SQLiteCommand(sql, conn)
                Dim da As New SQLiteDataAdapter
                da.SelectCommand = cmdDataGrid
                Dim dta As New DataTable
                da.Fill(dta)
                dgvDataArbo.DataSource = dta
                TreeViewToolBox.Nodes.Clear()
                For Each dr As DataRow In dta.Rows
                    AddNode(dr("PARENT").ToString, dr("FILS").ToString)
                Next
end if 


Problème :Problème

Après l’ouverture de la Form , j'ai toujours le nœud enfant créé mais sa clé (trace) a disparu !!!

Est ce un souci de stockage dans la BDD , si oui pourriez vous m'aider à créer la clé et conserver la spécifique pour chaque nœud créé?

Merci d'avance

31 réponses

Messages postés
493
Date d'inscription
jeudi 27 mars 2014
Statut
Membre
Dernière intervention
26 décembre 2020

Bonjour
Je corrige les By Val du coup .
Dans le code :
je souhaiterais supprimer par exemple le petit fils 3 dont le parent est Enfant 2.
Comment le repérer fidèlement dans la BDD pour le supprimer tout en sachant que d'autres petit fils 3 peuvent exister ailleurs dans l’arborescence avec d'autres parents .

Cordialement
Messages postés
15921
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
10 mai 2021
540
Avec son ID unique
Messages postés
493
Date d'inscription
jeudi 27 mars 2014
Statut
Membre
Dernière intervention
26 décembre 2020

OK
je sélectionne le nœud que je veux supprimer
Il me faut obtenir son ID unique pour aller le supprimer .
Comment le "choper" cet ID unique en sélectionnant le nœud?
Messages postés
15921
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
10 mai 2021
540
Dans mon projet exemple, dans le bouton qui ajoute un item, je t'ai montré comment récupérer l'instance de NoeudJulia. Cette instance contient le m_arborescence et donc l'ID
Messages postés
493
Date d'inscription
jeudi 27 mars 2014
Statut
Membre
Dernière intervention
26 décembre 2020

Ton code répond totalement a mes besoins ( bravo et merci )
je vais reprendre tout mon projet dessus
Par contre si je fais
Me.treeView1.SelectedNode.Remove()

le nœud est bien supprimé dans le treeview mais pas dans la BDD.

Help! pour un bouton Supprimer
Messages postés
15921
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
10 mai 2021
540
Et que fait-on des enfants (et des enfants des enfants, etc....) du noeud supprimé, dans la BDD?
Messages postés
493
Date d'inscription
jeudi 27 mars 2014
Statut
Membre
Dernière intervention
26 décembre 2020

J'ai un contrôle a ce niveau et un msgbox va avertir l’utilisateur
Dim msg As String = "Voulez-vous vraiment supprimer ce dossier " & "(" & Me.treeView1.SelectedNode.Text & ")" & " ?" & vbCrLf & "IMPORTANT!" & vbCrLf & "  la suppression de ce dossier supprimera tous les fichiers qu'il contient."

donc oui effectivement toute la fratrie et petits enfants seront supprimés
Messages postés
15921
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
10 mai 2021
540
Dans le principe.
Tu récupères le noeud père de la branche à supprimer.
Tu le castes en NoeudJulia, comme dans le bouton « ajouter ».

Tu initialises une liste à partir de ce noeud père ou de son ID.
Et c’est là que ça se complique.
Pour chaque enfant du père, il faut stocker le noeud ou l’ID dans la liste et regarder s’il y a des petits enfants, pour chaque petits enfants on recommence et ainsi de suite.

Ça peut se coder de différentes façons, par exemple de manière récursive.

Une fois fini, dans ta liste tu as accès à tous les ID (directement ou comme propriété du Noeud) à supprimer.
Messages postés
493
Date d'inscription
jeudi 27 mars 2014
Statut
Membre
Dernière intervention
26 décembre 2020

Bonjour
Avec ce procédé très détourné , j'arrive a détecter l'ID du noeud selectionné
dans l'événement after select du treeview

Me.parent.Text = Me.treeView1.SelectedNode.Parent.Text
     Me.fils.Text = Me.treeView1.SelectedNode.Text
    IDNODE.Text = ""
        ListBox1.Items.Clear()
        ListBox2.Items.Clear()
        For Each row As DataGridViewRow In dataGridView1.Rows
            If (row.Cells(0).Value = parent.Text) Then
                ListBox1.Items.Add(row.Cells(1).Value)
            End If
            If (row.Cells(0).Value = fils.Text) Then
                ListBox2.Items.Add(row.Cells(2).Value)
            End If
            For Each elmt As String In ListBox1.Items
                If Not ListBox2.Items.Contains(elmt) Then
                    If (fils.Text = row.Cells(0).Value) And (elmt = row.Cells(2).Value) Then
                        'MsgBox(row.Cells(1).Value)
                        IDNODE.Text = row.Cells(1).Value
                    End If
                End If
            Next
        Next
Messages postés
15921
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
10 mai 2021
540
Bonsoir

en fait, tu n'as rien compris à ce que je t'ai donné.
Ce n'est pas une critique, juste un constat.

Ce code, c'est du VB6.
Tu prends le datagridview pour la source de données.
Alors que la source de donnée, c'est le premier NoeudJulia.
Le datagridview et le treeview ne sont que de l'affichage, de la sélection, et éventuellement de la saisie, bref de l'interfaçage graphique.

Tu te sers des cellules, alors que tu as des objets avec des propriétés.

Si tu veux pouvoir utiliser au mieux les outils offerts par .Net, il faut que tu comprennes ce qu'est un objet. Les concepts qui s'y attachent et comment on les manipule.

Je peux te proposer la lecture d'une suite de tuto que j'ai écrite sur le sujet.
Ça n'est pas académique, car je suis autodidacte (comme toi, je suppose) et donc j'ai essayé de m'adresser à d'autres autodidactes pour leur éviter de tâtonner trop longtemps.
https://codes-sources.commentcamarche.net/faq/11239-la-programmation-objet-appliquee-a-net-par-l-exemple-partie-1-sur-3

Il faudrait aussi appréhender le binding (c'est le truc qui fait que le datagridview ne soit que de l'interfaçage graphique)
https://codes-sources.commentcamarche.net/faq/1291-utilisation-du-binding-au-travers-de-l-objet-databindingsource

Ensuite, je veux bien te montrer un code, plus optimisé et sans doute plus lisible (donc plus facile à maintenir)
Mais pas dans la semaine, j'ai assez peu de temps.

Messages postés
2427
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
6 mai 2021
137
Bonjour
J'avais du temps devant moi et j'ai codé ceci pour les boutons Ajouter et Supprimer .
Attention il faut d'abord sélectionner le nœud dans le Treeview
  ''' <summary>
    ''' Bouton Ajouter treeview
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub ButAjouter_Click(sender As Object, e As EventArgs) Handles butAjouter.Click
        Dim Node As TreeNode = treeView1.SelectedNode
        If Node Is Nothing Then Exit Sub ' si pas de sélection on sort
        Dim parent As NoeudJulia = CType(Node, NoeudJulia)
        Dim nouveau As NoeudJulia = New NoeudJulia(Date.Now.ToString("yyyy-MM-dd_HH-mm-ss"), parent, lesNoeuds, CON)
        AfficheDatas()
    End Sub

    ''' <summary>
    ''' bouton Supprimer treeview
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub ButSupprime_Click(sender As Object, e As EventArgs) Handles ButSupprime.Click
        Dim Node As TreeNode = treeView1.SelectedNode
        If Node Is Nothing Then Exit Sub ' si pas de sélection on sort
        If MessageBox.Show("Voulez-vous vraiment supprimer ce dossier " & "(" & Node.Text & ")" & " ?" & Environment.NewLine & "IMPORTANT!" & Environment.NewLine & "  la suppression de ce dossier supprimera tous les fichiers qu'il contient.", "Suppression dossier", MessageBoxButtons.YesNo, MessageBoxIcon.Information) = DialogResult.No Then Exit Sub
        Dim Noeud As NoeudJulia = CType(Node, NoeudJulia) ' le noeud père
        Node.Remove()
        Dim ListNoeudsSupprimes As List(Of NoeudJulia) = New List(Of NoeudJulia) From {Noeud} ' liste des noeuds à supprimer
        lesNoeuds.Remove(Noeud)
        RechercheFils(Noeud, ListNoeudsSupprimes) ' recherche récursive
        ' suppression de tous les noeuds à supprimer dans la base
        For Each NoeudSupprime As NoeudJulia In ListNoeudsSupprimes
            Dim strSQL As String = "DELETE FROM ARBORESCENCE WHERE ID= " & NoeudSupprime.Valeur.ID
            Dim cmd = New SQLiteCommand(strSQL, CON)
            cmd.ExecuteNonQuery()
            cmd.Dispose()
        Next
        AfficheDatas()

    End Sub

    ''' <summary>
    ''' Recherche récursive des noeuds fils
    ''' </summary>
    ''' <param name="Noeud"></param>
    ''' <param name="ListNoeuds"></param>
    Private Sub RechercheFils(Noeud As NoeudJulia, ByRef ListNoeuds As List(Of NoeudJulia))

        Dim NoeudsFils As List(Of NoeudJulia) = lesNoeuds.FindAll(Function(p) p.Valeur.IdParent = Noeud.Valeur.ID)
        If NoeudsFils.Count > 0 Then
            ListNoeuds.AddRange(NoeudsFils)
            For Each NoeudFils As NoeudJulia In NoeudsFils
                lesNoeuds.Remove(NoeudFils)
                RechercheFils(NoeudFils, ListNoeuds)
            Next
        End If

    End Sub


Messages postés
15921
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
10 mai 2021
540
Salut, le bouton Ajouter elle l'avait déjà.

Pour la suppression, ça y ressemble bien ;)
Messages postés
2427
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
6 mai 2021
137 >
Messages postés
15921
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
10 mai 2021

Salut Whis !
Oui mais j'ai rajouté le fait qu'il faut sélectionner un nœud dans le bouton Ajouter ! sinon on sort !
Messages postés
15921
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
10 mai 2021
540 >
Messages postés
2427
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
6 mai 2021

Ha oui
Messages postés
2427
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
6 mai 2021
137
Bonjour
Petite amélioration pour le bouton Supprimer
Au lieu de supprimer les nœuds un par un avec les 2 lignes
lesNoeuds.Remove(Noeud)
pour le nœud père et
lesNoeuds.Remove(NoeudFils)
pour les nœuds fils on le fait d'un seul coup avec la ligne
lesNoeuds = lesNoeuds.Except(ListNoeudsSupprimes).ToList


 ''' <summary>
    ''' bouton Supprimer treeview
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub ButSupprime_Click(sender As Object, e As EventArgs) Handles ButSupprime.Click
        Dim Node As TreeNode = treeView1.SelectedNode
        If Node Is Nothing Then Exit Sub
        If MessageBox.Show("Voulez-vous vraiment supprimer ce dossier " & "(" & Node.Text & ")" & " ?" & Environment.NewLine & "IMPORTANT!" & Environment.NewLine & "  la suppression de ce dossier supprimera tous les fichiers qu'il contient.", "Suppression dossier", MessageBoxButtons.YesNo, MessageBoxIcon.Information) = DialogResult.No Then Exit Sub
        Dim Noeud As NoeudJulia = CType(Node, NoeudJulia) ' le nœud père
        Dim ListNoeudsSupprimes As List(Of NoeudJulia) = New List(Of NoeudJulia) From {Noeud} ' liste des nœuds à supprimer
        Node.Remove()
        RechercheFils(Noeud, ListNoeudsSupprimes) ' recherche récursive
        ' on supprime tous les nœuds à supprimer dans la liste 
        lesNoeuds = lesNoeuds.Except(ListNoeudsSupprimes).ToList
        ' suppression de tous les nœuds à supprimer dans la base
        For Each NoeudSupprime As NoeudJulia In ListNoeudsSupprimes
            Dim strSQL As String = "DELETE FROM ARBORESCENCE WHERE ID= " & NoeudSupprime.Valeur.ID
            Dim cmd = New SQLiteCommand(strSQL, CON)
            cmd.ExecuteNonQuery()
            cmd.Dispose()
        Next
        AfficheDatas()

    End Sub

    ''' <summary>
    ''' Recherche récursive des nœuds fils
    ''' </summary>
    ''' <param name="Noeud"></param>
    ''' <param name="ListNoeuds"></param>
    Private Sub RechercheFils(Noeud As NoeudJulia, ByRef ListNoeuds As List(Of NoeudJulia))

        Dim NoeudsFils As List(Of NoeudJulia) = lesNoeuds.FindAll(Function(p) p.Valeur.IdParent = Noeud.Valeur.ID)
        If NoeudsFils.Count > 0 Then
            ListNoeuds.AddRange(NoeudsFils)
            For Each NoeudFils As NoeudJulia In NoeudsFils
                RechercheFils(NoeudFils, ListNoeuds)
            Next
        End If

    End Sub


Messages postés
493
Date d'inscription
jeudi 27 mars 2014
Statut
Membre
Dernière intervention
26 décembre 2020

Bonjour les gars
j'ai nettement pu avancer grâce a votre aide . Chapeau !
Je laisse le fil ouvert encore peu ... au cas ou ...
Encore merci