如何获取TreeView子选择节点以及上述节点?

时间:2017-02-02 20:07:50

标签: c# .net winforms treeview

private void treeView1_MouseClick(object sender, MouseEventArgs e)
{
    // Get the node that was clicked
    TreeNode selectedNode = treeView1.HitTest(e.Location).Node;

    if (selectedNode != null)
    {

    }
}

如果我有一个根节点:

World

当我点击它时,我看到了这些节点:

World
|____ Blue
|____ Green
|____ Red
|____ Black
|____ yellow

如果我点击 Blue ,我会在 Blue 下看到更多节点,例如

World
|____ Blue
|    |____ Day
|    |____ Night
|____ Green
|____ Red
|____ Black
|____ yellow

现在,如果我点击蓝色,我将获得所选节点名称​​蓝色selectedNode.Name蓝色

如果我点击将进入selectedNode.Name 但我想要做的是,如果我点击 Day selectedNode即可 Blue \ Day BlueDay

如果在 Day 下有另一个节点名 1 ,我点击 1 ,所以 selectedNode.Name 我想看 BlueDay1 或者我更喜欢 Blue \ Day \ 1

我想要这个\\所以我可以将它用作目录名。 问题是我使用selectedNode.Name作为目录来获取文件:

List<string> ff = new List<string>();
private void treeView1_MouseClick(object sender, MouseEventArgs e)
{
    TreeNode selectedNode = treeView1.HitTest(e.Location).Node;

    if (selectedNode != null)
    {
        string tt = mainPath + "\\" + selectedNode.Text;
        ff = DirSearch(tt);
        timer1.Enabled = true;
    }
}

如果我点击Blue然后就可以了,它将获得Blue下的所有文件,包括子目录。但是,如果我点击1并且有1个文件,那么它将不会获得任何文件,因为我需要完整的路径名 Blue \ Day \ 1 以从1获取文件。

这就是我获取文件的方式

static List<string> DirSearch(string sDir)
{
    List<string> files = new List<string>();
    try
    {
        foreach (string d in Directory.GetDirectories(sDir))
        {
            foreach (string f in Directory.GetFiles(d))
            {
                files.Add(f);
            }
            DirSearch(d);
        }
    }
    catch (System.Exception excpt)
    {
        Console.WriteLine(excpt.Message);
    }
    return files;
}

我的想法是,如果我想获取蓝色下的所有文件我点击蓝色但是如果我想在1中点击1时只获得1中的文件它不起作用,因为1不是完整路径。

1 个答案:

答案 0 :(得分:1)

每个TreeNode都有一个FullPath,它获取从根树节点到当前树节点的路径。例如,您可以看到树的所有节点的完整路径,如下面的树:

Tree                Full Path
==============================
1                   1
|__ 11              1\11
    |__ 111         1\11\111
    |__ 112         1\11\112

TreeView有一个PathSeparator字符,用于获取或设置树节点路径使用的分隔符字符串,默认为\

如果您希望更好地控制路径,可以使用AncestorsAncestorsAndSelf扩展方法。

在我下面提供的示例中,我创建了没有根节点的路径:

var pathWithoutRootNode = string.Join(@"\", 
    e.Node.AncestorsAndSelf().Where(x => x.Parent != null).Select(x => x.Text))