Treeview nodes. clé

Résolu
julia Namor Messages postés 524 Date d'inscription jeudi 27 mars 2014 Statut Membre Dernière intervention 13 janvier 2024 - 17 nov. 2020 à 07:37
julia Namor Messages postés 524 Date d'inscription jeudi 27 mars 2014 Statut Membre Dernière intervention 13 janvier 2024 - 4 déc. 2020 à 08:30
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

julia Namor Messages postés 524 Date d'inscription jeudi 27 mars 2014 Statut Membre Dernière intervention 13 janvier 2024
23 nov. 2020 à 19:36
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
0
Whismeril Messages postés 19040 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 9 mai 2024 656
23 nov. 2020 à 19:40
Avec son ID unique
0
julia Namor Messages postés 524 Date d'inscription jeudi 27 mars 2014 Statut Membre Dernière intervention 13 janvier 2024
23 nov. 2020 à 19:49
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?
0
Whismeril Messages postés 19040 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 9 mai 2024 656
23 nov. 2020 à 20:31
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
0
julia Namor Messages postés 524 Date d'inscription jeudi 27 mars 2014 Statut Membre Dernière intervention 13 janvier 2024
23 nov. 2020 à 21:05
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
0
Whismeril Messages postés 19040 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 9 mai 2024 656
23 nov. 2020 à 23:11
Et que fait-on des enfants (et des enfants des enfants, etc....) du noeud supprimé, dans la BDD?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
julia Namor Messages postés 524 Date d'inscription jeudi 27 mars 2014 Statut Membre Dernière intervention 13 janvier 2024
23 nov. 2020 à 23:20
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
0
Whismeril Messages postés 19040 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 9 mai 2024 656
24 nov. 2020 à 08:13
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.
0
julia Namor Messages postés 524 Date d'inscription jeudi 27 mars 2014 Statut Membre Dernière intervention 13 janvier 2024
Modifié le 25 nov. 2020 à 19:54
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
0
Whismeril Messages postés 19040 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 9 mai 2024 656
25 nov. 2020 à 22:25
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.

0
vb95 Messages postés 3474 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 7 mai 2024 169
Modifié le 26 nov. 2020 à 17:38
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


0
Whismeril Messages postés 19040 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 9 mai 2024 656
26 nov. 2020 à 19:46
Salut, le bouton Ajouter elle l'avait déjà.

Pour la suppression, ça y ressemble bien ;)
0
vb95 Messages postés 3474 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 7 mai 2024 169 > Whismeril Messages postés 19040 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 9 mai 2024
26 nov. 2020 à 20:57
Salut Whis !
Oui mais j'ai rajouté le fait qu'il faut sélectionner un nœud dans le bouton Ajouter ! sinon on sort !
0
Whismeril Messages postés 19040 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 9 mai 2024 656 > vb95 Messages postés 3474 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 7 mai 2024
26 nov. 2020 à 22:14
Ha oui
0
vb95 Messages postés 3474 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 7 mai 2024 169
Modifié le 27 nov. 2020 à 12:06
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


0
julia Namor Messages postés 524 Date d'inscription jeudi 27 mars 2014 Statut Membre Dernière intervention 13 janvier 2024
4 déc. 2020 à 08:30
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
0
Rejoignez-nous