如何从 xml 文件填充 WinForms TreeView,而不考虑子孙数量

How to populate WinForms TreeView from xml file, regardless the number of children and grandchildren

抱歉,如果之前已经发布过,但我能找到的所有解决方案都只解决了 XML 个包含子层的文件。

我有一个显示树视图的表单。我不想直接在代码中编辑,而是想创建一个 XML 文件,并从中填充我的树视图。我的 XML 与此类似:

<Root>
  <Element>
    <ChildElement>
      <GrandChildElement></GrandChildElement>
      <GrandChildElement></GrandChildElement>
    </ChildElement>
    <ChildElement>
      <GrandChildElement></GrandChildElement>
      <GrandChildElement></GrandChildElement>
    </ChildElement>
  </Element>
  <Element>
    <ChildElement>
      <GrandChildElement></GrandChildElement>
      <GrandChildElement></GrandChildElement>
    </ChildElement>
    <ChildElement>
      <GrandChildElement></GrandChildElement>
      <GrandChildElement></GrandChildElement>
    </ChildElement>
  </Element>
</Root>

GrandChildElements,是我的树视图中的可点击节点,可用于 select 不同的事物。其余的用于直观地对它们进行分类。

到目前为止,我还没有设法找到包含 GrandChildElements 的方法。在没有 GrandChildElements 的情况下填充它,可以通过这样的递归来完成:

private void treeView_Load(object sender, EventArgs e)
{
    XmlDocument xmldoc = new XmlDocument();
    System.IO.FileStream fs = new System.IO.FileStream("treeNodes.xml", FileMode.Open, FileAccess.Read);
    xmldoc.Load(fs);
    XmlNode xmlnode = xmldoc.ChildNodes[1];
    tvKortskab.Nodes.Clear();
    tvKortskab.Nodes.Add(new TreeNode(xmldoc.DocumentElement.Name));
    TreeNode tNode = tvKortskab.Nodes[0];
    AddNode(xmlnode, tNode);
}


 private void AddNode(XmlNode inXmlNode, TreeNode inTreeNode)
 {
     XmlNode xNode;
     TreeNode tNode;
     XmlNodeList childNodes;
     XmlNodeList subChildNodes;
     if (inXmlNode.HasChildNodes)
     {
         childNodes = inXmlNode.ChildNodes;
         for (int i = 0; i <= childNodes.Count - 1; i++)
         {
             xNode = childNodes[i];
             inTreeNode.Nodes.Add(new TreeNode(xNode.Name));
             tNode = inTreeNode.Nodes[i];
             AddNode(xNode, tNode);
         }
         else
         {
             inTreeNode.Text = inXmlNode.InnerText.ToString();
         }
 }

我试过在其中嵌套一个循环,检查子节点是否有子节点,然后添加它们。这行得通,但也添加了一堆空节点和重复节点。

希望我明白你的意思。

由于您的 GrandChildren 节点为空,因此下一行将在那里显示一个空值。

inTreeNode.Text = inXmlNode.InnerText.ToString();

一种可能的解决方案是在 innerText 为空时显示节点名称。

inTreeNode.Text = string.IsNullOrEmpty(inXmlNode.InnerText)? inXmlNode.Name :  inXmlNode.InnerText.ToString();

PS: 顺便说一句,你这里可能有错字

XmlNode xmlnode = xmldoc.ChildNodes[1];

这需要

XmlNode xmlnode = xmldoc.ChildNodes[0];

较早的输出

新输出

你的想法是对的,你做的是对的。

但是在 else 语句中你做错了什么。 你说 "GrandChildElement" 应该显示 InnerText 而这个文本是空的,所以你得到一个空元素。您需要改用 Name 属性。

if (inXmlNode.HasChildNodes)
{
    childNodes = inXmlNode.ChildNodes;
    for (int i = 0; i <= childNodes.Count - 1; i++)
    {
        xNode = childNodes[i];
        inTreeNode.Nodes.Add(new TreeNode(xNode.Name));
        tNode = inTreeNode.Nodes[i];
        AddNode(xNode, tNode);
    }
}
else
{
    inTreeNode.Text = inXmlNode.Name;
}