来自点符号平面文件的 C# treeview

标签 c# wpf treeview

我有一个如下所示的平面文件:

.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>

截图:

enter image description here

好吧,这段代码可以工作,但是它可能有一些缺陷并且不是一个完美的解决方案。无论如何,即使它不能完美运行,它也应该在某些方面为您提供帮助。

编辑: 这样,它有时不起作用,例如如果节点未排序。

我更改了程序的这一部分,因此它应该不会再有其他错误了。

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

enter image description here

但是使用更改后的代码,它会给出应有的输出!

关于来自点符号平面文件的 C# treeview,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32074193/

相关文章:

c# - tessnet初始化问题

c# - 确认消息框

c# - PRISM:区域未向 RegionManager 注册

delphi - TreeView:如何确定节点是否处于编辑模式?

delphi - Devexpress ExpressQuantumTreeList 与虚拟 TreeView ?

c# - 当节点展开或折叠时,如何更改 WPF TreeView 中节点的图像?

c# - 在对象列表中查找公共(public)元素

c# - C# 如何知道某个文件将触发哪个进程

.net - 测试 Wpf Control 实例化性能

c# - WPF:如何绑定(bind)到另一个控件绑定(bind)的属性?