我有一个如下所示的平面文件:
.root:NODE
.root.branch1:NODE
.root.branch1.size:INT
.root.branch1.name:STRING
.root.branch2:NODE
.root.branch2.flavor:NODE
.root.branch2.flavor.cost:INT
.root.branch2.flavor.name:STRING
文件内容、深度、长度等每次都会不同,所以我不能对任何内容进行硬编码(尽管节点的数据类型始终为“NODE”)。我需要将它作为数据源引入 C#。我不确定解析文件的最佳方法是将其转换为看起来像这样的结构
+root
+branch1
size:
name:
+branch2
+flavor
cost:
name:
等理想情况下,我想动态构建一个 TreeView 控件,用户可以使用它来选择他想要访问的节点(这些标签是实际数据源的路径;所以在代码的其他地方,我正在使用)
int iVal = somefunction.readvar(".root.branch2.flavor.cost");
/edit/如果有帮助,我要解析的文件是由 TwinCat 2 程序生成的 *.SYM 文件(符号文件)。这里有一些文档:http://infosys.beckhoff.com/content/1033/tcplccontrol/html/tcplcctrl_componentsoptions.htm#Symbol%20configuration
最佳答案
C#:
private void AddToTreeView()
{
TreeViewItem root = new TreeViewItem();
foreach (string line in ReadLines())
{
var parts = line.Split(new char[] { '.' },StringSplitOptions.RemoveEmptyEntries);
if (parts.Length == 1)
{
root.Header = parts[0].Split(':')[0];
root.Tag = line;
}
else
{
TreeViewItem node = root;
foreach (var part in parts)
{
var header = part.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries)[0];
if(!IfExists(node, header, ref node))
{
node.Items.Add(new TreeViewItem()
{
Header = header,
Tag = line
});
node = root;
}
}
}
}
treeView.Items.Add(root);
}
private bool IfExists(TreeViewItem itm, string header, ref TreeViewItem which)
{
if (itm.Header as string == header)
{
which = itm;
return true;
}
foreach (TreeViewItem i in itm.Items)
{
if (i.Header as string == header)
{
which = i;
return true;
}
else if (i.HasItems)
{
if (IfExists(i, header, ref which))
return true;
}
}
return false;
}
XAML:
<TreeView x:Name="treeView" Height="100">
</TreeView>
截图:
好吧,这段代码可以工作,但是它可能有一些缺陷并且不是一个完美的解决方案。无论如何,即使它不能完美运行,它也应该在某些方面为您提供帮助。
编辑: 这样,它有时不起作用,例如如果节点未排序。
我更改了程序的这一部分,因此它应该不会再有其他错误了。
if (!IfExists(node, header, ref node))
{
var currNode = new TreeViewItem()
{
Header = header,
Tag = line
};
node.Items.Add(currNode);
if (part.Contains(":"))
node = root;
else
node = currNode;
}
如果输入是之前代码的输出:
.root:NODE
.root.branch1:NODE
.root.branch2.flavor.name:STRING
.root.branch1.size:INT
.root.branch1.name:STRING
.root.branch2:NODE
.root.branch2.flavor:NODE
.root.branch2.flavor.cost:INT
但是使用更改后的代码,它会给出应有的输出!
关于来自点符号平面文件的 C# treeview,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32074193/