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

时间:2015-08-18 13:44:26

标签: 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:

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

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

1 个答案:

答案 0 :(得分:0)

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

但是使用更改后的代码,它会尽可能地提供输出!