将具有子节点的自定义TreeNode添加到TreeView

时间:2016-06-09 14:48:13

标签: c# winforms treeview

我有几个包含标题和一些数据的文件,我想根据标题中的信息创建一个ViewTree。 (以下只是一个示例代码,真正的代码要长得多。)

文件(仅限示例)

DataFile 1      DataFile 2      DataFile 3      DataFile 4          etc.
Net    1        Net    1        Net    1        Net    2        
Sub    1        Sub    2        Sub    2        Sub    1
Node   1        Node   1        Node   2        Node   1

以下代码确实将标题中的信息添加到ViewTree中,当我想使用选定的TreeViewNode时,问题出现了(在此问题中更进一步说明)

DataFile类

public class DataFile
{
    public enum Header
    {
        NET,
        SUB,
        NODE
    }

    public string FilePath { get; set; }

    public DataFile(string path) { FilePath = path; }

    public string HeaderValue(int row) 
    {
        return File.ReadLines(this.FilePath, Encoding.Default).Skip(row).First().Split('\t')[1];
    }
}

myNode类

public class myNode : DataFile
{
    public string Net { get { return HeaderValue((int)Header.Net); } }
    public string Sub { get { return HeaderValue((int)Header.Sub); } }
    public string Node { get { return HeaderValue((int)Header.Node); } }

    public myNode(string path):base(path: path) { }
}

我使用以下函数填充TreeView

public static void PopulateTree(TreeView tree, string searchpath)
{
    foreach(string datafile in Directory.GetFiles(searchpath, "datafile.txt", SearchOption.AllDirectories))
    {
        myNode node = new myNode(datafile);

        if (!tree
            .Nodes.ContainsKey(node.Net))
        {
            tree
                .Nodes.Add(node.Net, node.Net);
        if (!tree
            .Nodes[node.Net]
            .Nodes.ContainsKey(node.Sub))
        {
            tree
                .Nodes[node.Net]
                .Nodes.Add(node.Sub, node.Sub));
        }
        if (!tree
            .Nodes[node.Net]
            .Nodes[node.Sub]
            .Nodes.ContainsKey(node.Node))
        {
            tree
                .Nodes[node.Net]
                .Nodes[node.Sub]
                .Nodes.Add(node.Node, node.Node));
        }
        Application.DoEvents();
    }
}

这给了我以下TreeView结构

1
├─1
│ └─1
└─2
  ├─1
  └─2
2
└─1
  └─1

一切都很好但不是很有用。我希望节点包含数据属性与DataFile中的值。所以我决定按照

创建我自己的TreeNode类
public class myTreeNode : TreeNode
{
    private enum Header
    {
        NET,
        SUB,
        NODE
    }

    public string SearchPath { get; set; }
    public string Net { get; set; }
    public string Sub { get; set; }
    public string Node { get; set; }

    public string HeaderValue(int row) 
    {
        return File.ReadLines(this.SearchPath, Encoding.Default).Skip(row).First().Split('\t')[1];
    }

    public myTreeNode(string searchpath):base()
    {
        SearchPath = searchpath;
        Net = HeaderValue((int)Header.Net);
        Sub = HeaderValue((int)Header.Sub);
        Node = HeaderValue((int)Header.Node);
    }
}

我执行类似的功能来填充我的TreeView

myNode customNode = new myNode(datafile);

if (!tree
    .Nodes.ContainsKey(customNode.Net))
    tree
        .Nodes.Add(customNode.Net, customNode.Net));
etc.

它填充我的TreeView,就像上一个函数一样。

问题:如何从NodeMouseDoubleClick访问我的自定义TreeNode?我尝试将myNode传递给事件中的函数,但是我得到异常无法将TreeNode转换为myNode类型。

例如

private void treeView1_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
{
    myFunction((myNode)treeView1.SelectedNode); // also tried without (myNode) but got same exeption.
}

0 个答案:

没有答案