如何从 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;
}
抱歉,如果之前已经发布过,但我能找到的所有解决方案都只解决了 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;
}