在TreeView中添加子节点

22

我是C#的新手,没有编程经验。但我已经完成了C#基础知识的学习。 现在我想通过添加父节点和子节点来设计一个简单的树形视图。

我想为第二个节点添加第二个子节点,但我卡在这里了,不知道下一步该怎么做。

有什么想法吗?

这是代码:

    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);
    }

抱歉,我的表述可能不太清晰,我不确定我是否真的需要在这里使用它:

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

我想做的是添加父节点和子节点。在我的代码中,我可以添加多个父节点,但如果我想添加一个子节点,它只会添加到第一个父节点中。 如果我要添加一个子节点,我想要将其添加到第二个或第三个父节点中。
我的代码中只使用了一个名为treeview2的树形视图 这是屏幕截图 这是我的最终代码: 在我放置else之前,如果我什么都不选,就会出现错误。所以我这样做了,如果没有选择任何内容,它将把“child node”添加到“default node”或(parent1 node)。它似乎运行良好。谢谢大家;-)
    //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);
        }

附加问题:代码有没有其他更好的方式?因为在这里,我两次声明了字符串“yourChildNode”。一个在if中,另一个在else中,有没有简化的方法?


你在这里尝试做什么有点难以理解。你似乎有两个树形视图控件,但只有一个在使用中。你的代码示例中第一个控件的相关性是什么?在树形视图的层次结构中,你想要添加节点的哪个位置?也许一个屏幕截图或模型效果会对此有所帮助。 - 1800 INFORMATION
---你的解决方案在这里--- https://dev59.com/kV_Va4cB1Zd3GeqPR0YO - Mohamed Yunus
11个回答

22

虽然不是很糟糕,但你在addParentNode_Click()方法中忘记调用treeView2.EndUpdate()了。
你也可以在addChildNode_Click()方法的结尾处调用treeView2.ExpandAll()来直接查看子节点。

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();
  }
}

我不知道是否有错误,但是有两个TreeView。我把它改成了只有1个TreeView...

编辑:对于额外的问题的答案:
你可以在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();
    }
  }
}

注意:有关 ?? 操作符的信息,请参见http://www.yoda.arachsys.com/csharp/csharp2/nullable.html


谢谢Julien,你的代码可行,但我想在第二个父节点中添加子节点2。使用这段代码,如果我将子节点2添加到parentnode2,则不会按照该方式执行。它总是将新的子节点添加到parentnode1中。 - tintincutes
您想将子节点添加到最后插入的节点还是选定的节点? - Julien Poulin
将选定的节点作为示例。 - tintincutes
好的,我编辑了我的回答。希望这次做得正确 ;) - Julien Poulin
嘿,朱利安,非常感谢,那正是我需要的;-) 你真是个天使;-) - tintincutes
当你真正这样做时,请确保在尝试使用它之前检查SelectedNode不为null! - Byron Ross

14

我能在Stormenet的例子中加入一些KISS(保持简单愚蠢):

如果您已经有一个treeView或只是创建了它的一个实例: 让我们使用一些数据来填充它 - 例如一个父节点和两个子节点:

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

另一个例子,两个父母首先有两个孩子,第二个有一个孩子:

            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");

进一步了解 - child 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");

正如您所看到的,您可以有任意数量的子项和父项,它们可以具有子级的子级,以此类推......希望我能帮到您!


5

添加子节点的示例:

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");
        }

嗨Stormenet,谢谢。但我认为这是一个完成的树形视图,对吗? - tintincutes

2
看起来你只是将子节点添加到了第一个父节点 treeView2.Nodes[0].Nodes.Add(yourChildNode)
根据你想要的行为,你需要明确要将子节点添加到哪个父节点。
例如,从你的截图中可以看出,如果你想将子节点添加到第二个节点,你需要:
treeView2.Nodes[1].Nodes.Add(yourChildNode)
如果你想将子节点添加到当前选定的节点,获取 TreeView.SelectedNode 并将子节点添加到它。


尝试使用 TreeView 以了解该类的操作方式。不幸的是,MSDN 文档在代码示例方面非常简略...

这里缺少很多安全检查!

类似于(未经测试):
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
  }
}

谢谢Byron,我想将子节点添加到选定的父节点中。 你提到了TreeView.SelectedNode,我应该在addParentNode还是add_ChildNode按钮中添加它? 谢谢 - tintincutes
嗨,拜伦,在你的代码中,“Treenode”是“TreeNode”还是“Treenode”?因为如果我输入“Treenode”,就会出现红色标记。这意味着有些地方出错了。 - tintincutes

1
以下是用C#代码向TreeView添加节点和子节点的代码。 *

保持简单愚蠢(KISS:Keep It Simple & Stupid):)

protected void Button1_Click(object sender, EventArgs e)

{

        TreeNode a1 = new TreeNode("Apple");

        TreeNode b1 = new TreeNode("Banana");
        TreeNode a2 = new TreeNode("gree apple");
        TreeView2.Nodes.Add(a1);
        TreeView2.Nodes.Add(b1);
        a1.ChildNodes.Add(a2);

}


1
KISS 中没有 '&'。 - Tony_Henrich
这是节点。它没有ChildNotes属性。 - Tony_Henrich

1

我需要做类似的事情,遇到了同样的问题。我使用了AfterSelect事件来确保我没有获取先前选定的节点。

实际上,引用正确的节点以接收新的子节点非常容易。

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);
}

0
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
您可以按照以下步骤来填充带有父节点和子节点的treeView。同时,还可以使用父节点和子节点的显示成员和值成员:
   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
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);
            }


        }


回答问题时最好详细解释,以便其他网站用户更容易理解。 - Tristan

0
void tree()
{
    int counter = 0;
    int counter1 = 0;
    int counter2 = 0;
    treeView1.Nodes.Clear();


    var node = db.ChartOfAccounts.
    Include(c => c.chartOfAccounts)
    .Where(c => c.parent_account == null).ToList();

    foreach (var account in node)
    {
               treeView1.Nodes.Add(account.account_title);

                 var node1 = db.ChartOfAccounts
                .Where(c => c.parent_account == account.c_id).ToList();
                 bool t1 = db.ChartOfAccounts.Any(c => c.parent_account == account.c_id);
                 if (!t1) { counter = counter + 1; }
                else
                 {
                    foreach (var item in node1)
                     { treeView1.Nodes[(counter)].Nodes.Add(item.account_title);

                          bool test1 = db.ChartOfAccounts
                          .Any(c => c.parent_account == item.c_id);
                          if (!test1) { counter1 = counter1 + 1; }
                          else { 
                                      var node2 = db.ChartOfAccounts
                                  .Where(c => c.parent_account == item.c_id).ToList();

                                    foreach (var item2 in node2)
                                    {
                                        treeView1.Nodes[counter].Nodes[(counter1)].Nodes.Add(item2.account_title);

                                        bool test2 = db.ChartOfAccounts
                                        .Any(c => c.parent_account == item2.c_id);
                                        if (!test2) { counter2 = counter2 + 1; }
                                        else
                                        {
                                            var node3 = db.ChartOfAccounts
                                        .Where(c => c.parent_account == item2.c_id).ToList();

                                            foreach (var item3 in node3)
                                            { treeView1.Nodes[counter].Nodes[counter1].Nodes[counter2].Nodes.Add(item3.account_title); }
                                        }
                                    }
                                }
                     }
                    counter = counter + 1;
                 }
    }
}

2
这个问题已经有10个现有答案,其中包括一个得票最高、被接受的答案,获得了20多个赞同票。你确定你的解决方案还没有被提出过吗?如果不是,为什么你认为你的方法比已经得到社区验证的现有方案更好?在Stack Overflow上提供解释总是有用的,但在问题已经得到OP和社区满意解决的情况下,这尤其重要。通过解释你的答案与众不同的地方以及何时可能更受欢迎,帮助读者更好地理解。 - Jeremy Caney
请至少修正您的缩进和编码风格。我已经为您添加了更多有用的Markdown,并将所有内容的缩进级别降低了几个级别,但其余部分由您自己决定。 - General Grievance

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接