locked
Meilleure façon de supprimer un node dans un treeview RRS feed

  • Question

  • Bonjour,

    Les seules méthodes que j'ai trouvé en VbNet pour supprimer un node dans un treeview sont:
    TreeNodeCollection.Remove
    TreeNodeCollection.RemoveAt
    TreeNodeCollection.RemoveByKey

    Donc pour supprimer un node (NodeAsupprimer) dont on ne connait pas la collection (TreeNodeCollection )à laquelle il appartient,
    il est nécessaire de "remonter" au parent pour accéder à la suppression:
    NodeASupprimer.Parent.Nodes.Remove(NodeAsupprimer)

    Ceci ne me semble pas optimisé...
    Connaissez-vous un autre moyen de supprimer un Node dans un Treeview ?

    Merci d'avance


    Projet volumineux en cours de migration de Vb6 à VbNet2008 Visual Studio 2008 - VbNET/Vb6(COM)
    mercredi 3 février 2010 12:58

Réponses

  • Bonjour Golard,

    Tu te compliques beaucoup la vie :)

    Connaissez-vous un autre moyen de supprimer un Node dans un Treeview ?

    Il te suffit de faire NodeASupprimer.Remove()

    Comme dit dans l'article MSDN ci-dessous : Remove supprime le nœud d'arbre en cours du contrôle TreeView.
    http://msdn.microsoft.com/fr-fr/library/system.windows.forms.treenode.remove.aspx

    On va faire un petit test.
    On prend un TreeView, on lui ajoute un Node, puis ce Node, on lui fait un Remove.

    En C# :

        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            private void button1_Click(object sender, EventArgs e)
            {
                TreeNode node = new TreeNode();
                TreeView tree = new TreeView();
                tree.Nodes.Add(node);
                Console.WriteLine("Nombre de nodes :: " + tree.GetNodeCount(true).ToString());
                node.Remove();
                Console.WriteLine("Nombre de nodes :: " + tree.GetNodeCount(true).ToString());
            }
        }


    En VB.Net :

    Public Partial Class Form1
        Inherits Form
        Public Sub New()
            InitializeComponent()
        End Sub
        
        Private Sub button1_Click(ByVal sender As Object, ByVal e As EventArgs)
            Dim node As New TreeNode()
            Dim tree As New TreeView()
            
            tree.Nodes.Add(node)
            
            Console.WriteLine("Nombre de nodes :: " & tree.GetNodeCount(True).ToString())
            
            node.Remove()
            
            Console.WriteLine("Nombre de nodes :: " & tree.GetNodeCount(True).ToString())
        End Sub
    End Class


    Voilà ce que tu obtiens :

    Nombre de nodes :: 1
    Nombre de nodes :: 0

    On voit donc bien que le Remove a supprimé le Node du TreeView, sans que tu aies besoin d'accéder au Parent.

    Cordialement,

    Thomas


    Thomas Aimonetti - C# - Sharplog Engineering - http://www.sharplog.fr

    • Proposé comme réponse Gabriel Mongeon mercredi 3 février 2010 14:35
    • Marqué comme réponse Golard jeudi 4 février 2010 08:00
    mercredi 3 février 2010 13:36

Toutes les réponses

  • Bonjour Golard,

    Tu te compliques beaucoup la vie :)

    Connaissez-vous un autre moyen de supprimer un Node dans un Treeview ?

    Il te suffit de faire NodeASupprimer.Remove()

    Comme dit dans l'article MSDN ci-dessous : Remove supprime le nœud d'arbre en cours du contrôle TreeView.
    http://msdn.microsoft.com/fr-fr/library/system.windows.forms.treenode.remove.aspx

    On va faire un petit test.
    On prend un TreeView, on lui ajoute un Node, puis ce Node, on lui fait un Remove.

    En C# :

        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            private void button1_Click(object sender, EventArgs e)
            {
                TreeNode node = new TreeNode();
                TreeView tree = new TreeView();
                tree.Nodes.Add(node);
                Console.WriteLine("Nombre de nodes :: " + tree.GetNodeCount(true).ToString());
                node.Remove();
                Console.WriteLine("Nombre de nodes :: " + tree.GetNodeCount(true).ToString());
            }
        }


    En VB.Net :

    Public Partial Class Form1
        Inherits Form
        Public Sub New()
            InitializeComponent()
        End Sub
        
        Private Sub button1_Click(ByVal sender As Object, ByVal e As EventArgs)
            Dim node As New TreeNode()
            Dim tree As New TreeView()
            
            tree.Nodes.Add(node)
            
            Console.WriteLine("Nombre de nodes :: " & tree.GetNodeCount(True).ToString())
            
            node.Remove()
            
            Console.WriteLine("Nombre de nodes :: " & tree.GetNodeCount(True).ToString())
        End Sub
    End Class


    Voilà ce que tu obtiens :

    Nombre de nodes :: 1
    Nombre de nodes :: 0

    On voit donc bien que le Remove a supprimé le Node du TreeView, sans que tu aies besoin d'accéder au Parent.

    Cordialement,

    Thomas


    Thomas Aimonetti - C# - Sharplog Engineering - http://www.sharplog.fr

    • Proposé comme réponse Gabriel Mongeon mercredi 3 février 2010 14:35
    • Marqué comme réponse Golard jeudi 4 février 2010 08:00
    mercredi 3 février 2010 13:36
  • bonjour,

    Si vous souhaitez supprimer un noeud dans un arbre et que vous connaissez la valeur de la propriété Name vous pouvez faire ainsi :

           TreeView1.Nodes.Find("ValeurDansLaProprieteName", True)(0).Remove()

    Peu importe le niveau de votre noeud, cette méthode retourne la collection de noeud dont la valeur de Name est (dans le cas présent) "ValeurDansLaProprieteName". 

    Pour la suite il reste les méthodes que vous avez citées ainsi que TreeView1.SelectedNode.Remove() pour supprimer le noeud selectionné.

    cordialement,

    Mathieu
    Mathieu Francesch Sharplog Engineering
    mercredi 3 février 2010 14:00
  • Merci pour vos réponses,

    Effectivement, j'avais classé les éléments d'objets par type (au lieu de l'ordre alphabétique) et je n'avais PAS VU Treenode.Remove !!!

    pour la proposition de Mathieu

    TreeView1.Nodes.Find("ValeurDansLaProprieteName", True)(0).Remove()


    je pense qu'il ne faut pas oublier de la faire précéder du test

    if not TreeView1.Nodes.Find("ValeurDansLaProprieteName", True)(0) is nothing then


    Cordialement,


    Projet volumineux en cours de migration de Vb6 à VbNet2008 Visual Studio 2008 - VbNET/Vb6(COM)
    jeudi 4 février 2010 08:06
  • Bien entendu.

    Cordialement,

    Mathieu
    Mathieu Francesch - MCTS/MCPD - Sharplog Engineering
    jeudi 4 février 2010 11:22