【问题标题】:Creating a Treeview structure in c# with main nodes and subnodes在 C# 中创建具有主节点和子节点的 Treeview 结构
【发布时间】:2017-01-06 08:43:57
【问题描述】:

我想根据从已解析的 xml 文档中获得的信息显示树视图结构。它必须只显示“ItemName”,并且根据节点的“级别”,它假设级别 1 是父节点,级别 2 是子节点,级别 3 是子节点的子节点(叶子)。

当我想添加子节点或遍历 xml 节点时出现错误,它只保存最后一个节点和子节点。

这是我到目前为止所做的

请注意,这必须显示在窗体结构视图中

private void TreeNodeStrcutureManually(XmlDocument structure)
    {


        treeView1.Nodes.Clear();

        XmlElement root = structure.DocumentElement;
        XmlNodeList itemName = root.GetElementsByTagName("ItemName");
        XmlNodeList level = root.GetElementsByTagName("Level");


        string parent = "";
        string childNode1 = "";
        string childNode2 = "";


        {
            for (int i = 0; i < itemName.Count; i++)
            {



                TreeNode tNode;


                if (level.Item(i).InnerText == "1")
                {

                    parent = itemName.Item(i).InnerText;
                    tNode = treeView1.Nodes.Add(parent);

                }

                if (level.Item(i).InnerText == "2")
                {
                    childNode1 = itemName.Item(i).InnerText;
                    tNode.Nodes.Add(childNode1);
                }

                if (level.Item(1).InnerText == "3")
                {

                    childNode2 = itemName.Item(i).InnerText;
                     tNode.Nodes.Add(childNode2);
                }
              }
           }

这里是一个如何返回 xml 的示例:

                  <HR>
                     <ItemName> Addidas</ItemName>
                       <level> 1 </level>
                  </HR>


                  <HR>
                    <ItemName> Shoe </ItemName>
                    <level> 2 </level>
                   </HR>

                  <HR>
                   <ItemName> Tshirt </ItemName>
                    <level> 2 </level>
                     </HR>

                      <HR>
                     <ItemName> shoelace </ItemName>
                     <level> 2 </level> 
                     </HR>


                       <HR>
                        <ItemName> Running </ItemName>
                       <level> 3 </level>
                      </HR> 

                        <HR>
                         <ItemName> Nike </ItemName>
                       <level> 1 </level>
                          </HR>

【问题讨论】:

  • 您遇到了什么异常?
  • tNode.Nodes.Add(childNode1) 在“使用未分配的局部变量 tNode”这一行给出错误
  • OK...tNode 必须有一个实例:TreeNode tNode = new TreeNode();
  • 谢谢,带走了异常,但还是只添加父节点,不添加其余子节点
  • 请看下面我的回答

标签: c# tree treeview


【解决方案1】:

这是一个如何使用树视图节点来创建层次结构的示例。 每个分支都必须有 TreeNode 对象。 正如您在示例中看到的那样,父母和孩子之间必须存在“绑定”。 希望能帮助到你。

    private void TreeNodeStrcutureManually()
    {
TreeNode level1=new TreeNode();
TreeNode level2=new TreeNode();
TreeNode level3=new TreeNode();
TreeNode level4=new TreeNode();
TreeNode level5=new TreeNode(); 


            for (int i = 0; i <= 4; i++)
            {
               switch (i)

                {
                case 0:
                        level1 = treeView1.Nodes.Add("LEVEL1");
                        break;
                case 1:
                        level2 = level1.Nodes.Add("LEVEL2");
                    break;
                case 2:
                    level3 = level2.Nodes.Add("LEVEL3");
                    break;
                case 3:
                    level4 = level3.Nodes.Add("LEVEL4");
                    break;
                case 4:
                    level5 = level4.Nodes.Add("LEVEL5");
                    break;
                default:

                    break;
                }
            }
    }

更新:

你解析 xml 的方式不正确,这就是你得到的原因:

对象引用未设置为对象的实例。

这是一种更高效、更严格的方法:

    private void TreeNodeStrcutureManually(XmlDocument x)
    {

    TreeNode level1 = new TreeNode();
    TreeNode level2 = new TreeNode();
    TreeNode level3 = new TreeNode();

    XmlNodeList nl = x.SelectNodes("DOC");
    XmlNode root = nl[0];

    foreach (XmlNode xnode in root.ChildNodes)
    {
        string level = xnode.LastChild.InnerText;

        switch (level)
        {
            case " 1 ":
                level1 = treeView1.Nodes.Add(level);
                break;
            case " 2 ":
                level2 = level1.Nodes.Add(level);
                break;
            case " 3 ":
                level3 = level2.Nodes.Add(level);
                break;
            default:

                break;

        }
    }
}

这就是带有&lt;DOC&gt; &lt;/DOC&gt;父标签的xml:

还要注意 level1 节点的值有空格(“1”替换为“1”)。

- <DOC>
- <HR>
  <ItemName>Addidas</ItemName> 
  <level>1</level> 
  </HR>
- <HR>
  <ItemName>Shoe</ItemName> 
  <level>2</level> 
  </HR>
- <HR>
  <ItemName>Tshirt</ItemName> 
  <level>2</level> 
  </HR>
- <HR>
  <ItemName>shoelace</ItemName> 
  <level>2</level> 
  </HR>
- <HR>
  <ItemName>Running</ItemName> 
  <level>3</level> 
  </HR>
- <HR>
  <ItemName>Nike</ItemName> 
  <level>1</level> 
  </HR>
  </DOC>

【讨论】:

  • 看不到原始 XML。正确的 XML 应该具有包装文档的父标记,将“”替换为原始 xml 上的包装标记名称。如果没有正确编写 xml 寻找操作 xml 的方法,.NET 框架中有很多工具可以做到这一点。如果适合您,请将其标记为答案。祝你项目好运!
  • 我已经这样做了,并得到以下异常:表达式必须评估为节点集。是否有一种方法可以让我跳过该步骤并从
    节点开始?
  • const string quote = "\""; string web = "ArrayOfExplorer_Response xmlns= " + quote + " www.xxx.co.za " + quote + " xmlns:i= " + quote + " w3.org/2001/XMLSchema-instance" + quote + ""; 我试过像上面那样声明
猜你喜欢
  • 2016-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-14
  • 1970-01-01
  • 1970-01-01
  • 2020-06-03
相关资源
最近更新 更多