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

C# treeview from dot notation flat file

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

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

等理想情况下,我想动态构建一个树视图控件,用户可以使用它来 select 他想访问的节点(这些标签是实际数据源的路径;所以在代码的其他地方,我是使用)

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

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