Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从xml文件填充WinForms TreeView,而不考虑子代和子代的数量_C#_Winforms_Treeview - Fatal编程技术网

C# 如何从xml文件填充WinForms TreeView,而不考虑子代和子代的数量

C# 如何从xml文件填充WinForms TreeView,而不考虑子代和子代的数量,c#,winforms,treeview,C#,Winforms,Treeview,很抱歉,如果之前已经发布过这篇文章,那么我可以找到的所有解决方案都是在子层上有地址的XML文件 我有一张显示树视图的表格。我希望创建一个XML文件,并从中填充我的treeview,而不必直接在代码中进行编辑。我的XML与此类似: <Root> <Element> <ChildElement> <GrandChildElement></GrandChildElement> <GrandChildE

很抱歉,如果之前已经发布过这篇文章,那么我可以找到的所有解决方案都是在子层上有地址的XML文件

我有一张显示树视图的表格。我希望创建一个XML文件,并从中填充我的treeview,而不必直接在代码中进行编辑。我的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>

这些元素是我的树视图中的可点击节点,可以用来选择不同的东西。其余部分用于直观地对它们进行分类

到目前为止,我还没有找到一种方法来包含这些元素。在不使用子元素的情况下填充它,可以通过如下递归完成:

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();
         }
 }
private void treeView_Load(对象发送方,事件参数e)
{
XmlDocument xmldoc=新的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();
添加(新的TreeNode(xmldoc.DocumentElement.Name));
TreeNode tNode=tvKortskab.Nodes[0];
AddNode(xmlnode,tNode);
}
私有void AddNode(XmlNode中的XmlNode,TreeNode中的TreeNode)
{
xmlnodexnode;
三烯醇化物;
XmlNodeList子节点;
XmlNodeList亚山体节点;
if(inXmlNode.HasChildNodes)
{
childNodes=inXmlNode.childNodes;

对于(int i=0;i我希望我理解你的意思

因为您的子节点是空的,所以下面的行将在那个里显示一个空值

inTreeNode.Text = inXmlNode.InnerText.ToString();
一种可能的解决方案是在innerText为空时显示节点名称

inTreeNode.Text = string.IsNullOrEmpty(inXmlNode.InnerText)? inXmlNode.Name :  inXmlNode.InnerText.ToString();
顺便说一句,你这里可能有打字错误

XmlNode xmlnode = xmldoc.ChildNodes[1];
这需要改进

XmlNode xmlnode = xmldoc.ChildNodes[0];
早期输出

新输出


我希望我能理解你的意思

因为您的子节点是空的,所以下面的行将在那个里显示一个空值

inTreeNode.Text = inXmlNode.InnerText.ToString();
一种可能的解决方案是在innerText为空时显示节点名称

inTreeNode.Text = string.IsNullOrEmpty(inXmlNode.InnerText)? inXmlNode.Name :  inXmlNode.InnerText.ToString();
顺便说一句,你这里可能有打字错误

XmlNode xmlnode = xmldoc.ChildNodes[1];
这需要改进

XmlNode xmlnode = xmldoc.ChildNodes[0];
早期输出

新输出


你的想法是正确的,你做了正确的事

但是在
else
语句中,您做错了什么。 你说,“孙子元素”应该显示
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;
}
if(inXmlNode.HasChildNodes)
{
childNodes=inXmlNode.childNodes;

对于(inti=0;i你的想法是正确的,你做了正确的事情

但是在
else
语句中,您做错了什么。 你说,“孙子元素”应该显示
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;
}
if(inXmlNode.HasChildNodes)
{
childNodes=inXmlNode.childNodes;

对于(int i=0;我可以更具体地说,为什么孙子元素不起作用?从我对递归的了解来看,它似乎应该起作用。请注意,你的孙子节点没有值。这是你的意思吗?我知道它起作用,但由于孙子节点没有子节点,文本会被改写“inTreeNode.Text=inXmlNode.InnerText.ToString();“你能说得更具体一点吗,为什么孙子元素不工作?从我对递归的了解来看,它似乎应该工作。请注意,你的孙子节点没有值。这是你的意思吗?我知道它工作,但由于孙子节点没有子节点,文本会被改写“inTreeNode.Text=inXmlNode.InnerText.ToString();”谢谢你的回答。我完全同意关于打字错误的部分。如果我将其设置为索引0,它只会显示“xml”“在没有节点的列表中。但是你是对的,一开始忽略第一个索引似乎是一个错误。谢谢你的回答。我完全同意关于打字错误的部分。如果我将其设置为索引0,则在没有节点的列表中只显示“xml”。但是你是对的,一开始忽略第一个索引似乎是一个错误。