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