web-dev-qa-db-fra.com

ajout de nœuds enfants dans l'arborescence

Je suis nouveau en C # et je n'ai aucune expérience en programmation. Mais j’ai terminé les bases du C # . Maintenant, je voudrais concevoir une vue arborescente simple en ajoutant un noeud parent et un noeud enfant.

Je voudrais ajouter un deuxième enfant pour le deuxième nœud, je suis assez coincé ici et je ne sais pas quelle est la suite.

Des idées?

Voici le code:

    private void addParentNode_Click(object sender, EventArgs e)
    {
        string yourParentNode;
        yourParentNode = textBox1.Text.Trim();
        treeView2.Nodes.Add(yourParentNode);
    }

    private void addChildNode_Click(object sender, EventArgs e)
    {
        string yourChildNode;
        yourChildNode = textBox1.Text.Trim();
        treeView2.Nodes[0].Nodes.Add(yourChildNode);
    }

Désolé de ne pas avoir été clair, je ne suis pas sûr d'avoir vraiment besoin de celui-ci ici: 

  //treeView1.BeginUpdate(); 
  //treeView1.Nodes.Clear();

Ce que j'essaie de faire, c'est d'ajouter des nœuds parents et un nœud enfant. Dans mon code, je peux ajouter plusieurs nœuds parents, mais si je veux ajouter un nœud enfant, il ajoute uniquement le premier nœud parent. Je veux que si j'ajoute un noeud enfant, je veux l'ajouter au deuxième parent ou au troisième parent.

Dans mon code, je n'utilise qu'un seul arbre ici, qui s'appelle treeview2Voici le screenshot

voici à quoi ressemble mon code final: Avant de mettre le reste, je reçois une erreur si je ne sélectionne rien. Je me suis donc dit que si rien n'était sélectionné, le "noeud enfant" serait ajouté au "noeud par défaut" ou (noeud parent1). Cela semble bien fonctionner. Merci les gars;-)

    //This is for adding a parent node
    private void addParentNode_Click(object sender, EventArgs e)
    {
        treeView2.BeginUpdate();

        string yourParentNode;
        yourParentNode = textBox1.Text.Trim();
        treeView2.Nodes.Add(yourParentNode);
        treeView2.EndUpdate();
    }

    //This is for adding child node
    private void addChildNode_Click(object sender, EventArgs e)
    {
        if (treeView2.SelectedNode != null)
        {
            string yourChildNode;
            yourChildNode = textBox1.Text.Trim();

            treeView2.SelectedNode.Nodes.Add(yourChildNode);
            treeView2.ExpandAll();
        }
        //This is for adding the child node to the default node(parent 1 node)
        else
        {
            string yourChildNode;
            yourChildNode = textBox1.Text.Trim();
            treeView2.Nodes[0].Nodes.Add(yourChildNode);
        }

Question supplémentaire: existe-t-il d'autres moyens d'améliorer le code? Parce qu'ici, je déclare la chaîne "yourChildNode" deux fois. Un dans le si et un autre dans le reste, y a-t-il une simplification? 

14
tintincutes

Ce n'est pas si grave, mais vous avez oublié d'appeler treeView2.EndUpdate() dans votre méthode addParentNode_Click().
Vous pouvez également appeler treeView2.ExpandAll() à la fin de votre méthode addChildNode_Click() pour voir votre nœud enfant directement. 

private void addParentNode_Click(object sender, EventArgs e) {
  treeView2.BeginUpdate();
  //treeView2.Nodes.Clear();
  string yourParentNode;
  yourParentNode = textBox1.Text.Trim();
  treeView2.Nodes.Add(yourParentNode);
  treeView2.EndUpdate();
}

private void addChildNode_Click(object sender, EventArgs e) {
  if (treeView2.SelectedNode != null) {
    string yourChildNode;
    yourChildNode = textBox1.Text.Trim();
    treeView2.SelectedNode.Nodes.Add(yourChildNode);
    treeView2.ExpandAll();
  }
}

Je ne sais pas si c'était une erreur ou non, mais il y avait 2 TreeViews. Je l'ai changé pour seulement 1 TreeView ...

EDIT: Réponse à la question supplémentaire:
Vous pouvez déclarer la variable contenant le nom du noeud enfant en dehors de la clause if:

private void addChildNode_Click(object sender, EventArgs e) {
  var childNode = textBox1.Text.Trim();
  if (!string.IsNullOrEmpty(childNode)) {
    TreeNode parentNode = treeView2.SelectedNode ?? treeView2.Nodes[0];
    if (parentNode != null) {
      parentNode.Nodes.Add(childNode);
      treeView2.ExpandAll();
    }
  }
}

Note: voir http://www.yoda.arachsys.com/csharp/csharp2/nullable.html pour plus d’informations sur les ?? opérateur.

21
Julien Poulin

Puis-je ajouter à l'exemple de Stormenet quelques KISS (Keep It Simple & Stupid):

Si vous avez déjà une arborescence ou venez de créer une instance de celle-ci: Un parent deux enfants:

            treeView1.Nodes.Add("ParentKey","Parent Text");
            treeView1.Nodes["ParentKey"].Nodes.Add("Child-1 Text");
            treeView1.Nodes["ParentKey"].Nodes.Add("Child-2 Text");

Un autre ex. le premier parent de deux parents a le deuxième enfant de deux enfants:

            treeView1.Nodes.Add("ParentKey1","Parent-1  Text");
            treeView1.Nodes.Add("ParentKey2","Parent-2 Text");
            treeView1.Nodes["ParentKey1"].Nodes.Add("Child-1 Text");
            treeView1.Nodes["ParentKey1"].Nodes.Add("Child-2 Text");
            treeView1.Nodes["ParentKey2"].Nodes.Add("Child-3 Text");

Prenez si plus loin - sous-enfant de l'enfant 2:

            treeView1.Nodes.Add("ParentKey1","Parent-1  Text");
            treeView1.Nodes["ParentKey1"].Nodes.Add("Child-1 Text");
            treeView1.Nodes["ParentKey1"].Nodes.Add("ChildKey2","Child-2 Text");
            treeView1.Nodes["ParentKey1"].Nodes["ChildKey2"].Nodes.Add("Child-3 Text");

Comme vous le voyez, vous pouvez avoir autant d'enfants et de parents que vous le souhaitez et ceux qui en ont sous d'enfant, etc.

11
Roman Polen.

On dirait que vous ajoutez seulement des enfants au premier parent treeView2.Nodes[0].Nodes.Add(yourChildNode)
Selon votre comportement, vous devez indiquer explicitement le noeud parent auquel vous souhaitez ajouter l'enfant.
Par exemple, à partir de votre capture d'écran, si vous souhaitez ajouter l'enfant au deuxième nœud, il vous faudrait:
treeView2.Nodes[1].Nodes.Add(yourChildNode)
Si vous souhaitez ajouter les enfants au nœud sélectionné, récupérez le TreeView.SelectedNode et ajoutez-y les enfants.

Essayez TreeView pour avoir une idée du fonctionnement de la classe. Malheureusement, la documentation de msdn est assez légère sur les exemples de code ...

Il me manque beaucoup de contrôles de sécurité ici!

Quelque chose comme (non testé):

private void addChildNode_Click(object sender, EventArgs e) {
  TreeNode ParentNode = treeView2.SelectedNode;  // for ease of debugging!
  if (ParentNode != null) {
    ParentNode.Nodes.Add("Name Of Node");
    treeView2.ExpandAll();   // so you can see what's been added              
    treeView2.Invalidate();  // requests a redraw
  }
}
2
Byron Ross

Exemple d’ajout de nœuds enfants:

private void AddExampleNodes()
        {
            TreeNode node;

            node = treeView1.Nodes.Add("Master node");
            node.Nodes.Add("Child node");
            node.Nodes.Add("Child node 2");

            node = treeView1.Nodes.Add("Master node 2");
            node.Nodes.Add("mychild");
            node.Nodes.Add("mychild");
        }
2
Stormenet

Je devais faire quelque chose de similaire et suis tombé sur les mêmes problèmes. J'ai utilisé l'événement AfterSelect pour m'assurer de ne pas obtenir le nœud précédemment sélectionné.

En réalité, il est très facile de référencer le bon noeud pour recevoir le nouveau noeud enfant. 

private void TreeView1_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)
{
   //show dialogbox to let user name the new node
   frmDialogInput f = new frmDialogInput();
   f.ShowDialog();

    //find the node that was selected
    TreeNode myNode = TreeView1.SelectedNode;
    //create the new node to add
    TreeNode newNode = new TreeNode(f.EnteredText);
    //add the new child to the selected node
    myNode.Nodes.Add(newNode);
}
1
tkflick
void treeView(string [] LineString)
    {
        int line = LineString.Length;
        string AssmMark = "";
        string PartMark = "";
        TreeNode aNode;
        TreeNode pNode;
        for ( int i=0 ; i<line ; i++){
            string sLine = LineString[i];
            if ( sLine.StartsWith("Assembly:") ){
                sLine  = sLine.Replace("Assembly:","");
                string[] aData = sLine.Split(new char[] {','});
                AssmMark  = aData[0].Trim();
                //TreeNode aNode;
                //aNode = new TreeNode(AssmMark);
                treeView1.Nodes.Add(AssmMark,AssmMark);
            }
            if( sLine.Trim().StartsWith("PART:") ){
                sLine  = sLine.Replace("PART:","");
                string[] pData = sLine.Split(new char[] {','});
                PartMark = pData[0].Trim();
                pNode = new TreeNode(PartMark);
                treeView1.Nodes[AssmMark].Nodes.Add(pNode);
            }
        }
0
Tours
SqlConnection con = new SqlConnection(@"Data Source=NIKOLAY;Initial Catalog=PlanZadanie;Integrated Security=True");
        SqlCommand cmd = new SqlCommand();
        DataTable dt = new DataTable();
        public void loadTree(TreeView tree)
        {
            cmd.Connection = con;
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = "SELECT [RAZDEL_ID],[NAME_RAZDEL] FROM [tbl_RAZDEL]";
            try
            {
                con.Open();
                SqlDataReader reader = cmd.ExecuteReader();
                while (reader.Read())
                {
                    tree.Nodes.Add(reader.GetString(1));
                    tree.Nodes[0].Nodes.Add("yourChildNode");
                    tree.ExpandAll();

                }

                con.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ошибка с сообщением: " + ex.Message);
            }


        }

0
koly86

Vous pouvez procéder comme suit pour remplir TreeView avec les nœuds parent et enfant. Et aussi avec display et value membre des nœuds parent et enfant:

   arrayRoot = taskData.GetRocordForRoot();  // iterate through database table
    for (int j = 0; j <arrayRoot.length; j++) { 
                TreeNode root = new TreeNode();  // Creating new root node
                root.Text = "displayString";
                root.Tag = "valueString";
                treeView1.Nodes.Add(root); //Adding the root node

             arrayChild = taskData.GetRocordForChild();// iterate through database table
                for (int i = 0; i < arrayChild.length; i++) {
                    TreeNode child = new TreeNode(); // creating child node
                    child.Text = "displayString"
                    child.Tag = "valueString";
                    root.Nodes.Add(child); // adding child node
                }

            }
0
Rashedul.Rubel