【问题标题】:How can I get a TreeView child selected node but also the above nodes?如何获得 TreeView 子选定节点以及上述节点?
【发布时间】:2017-02-02 20:07:49
【问题描述】:
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

现在,如果我单击蓝色,我将获得选定的节点名称 BlueselectedNode.Name 将是蓝色

如果我点击 Day 将进入selectedNode.Name Day 但我想要做的是,如果我点击 DayselectedNodeBlue\DayBlueDay

如果在 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;
    }
}

如果我点击蓝色,那么它会得到蓝色下的所有文件,包括子目录。但是,如果我单击 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;
}

这个想法是,如果我想获取 Blue 下的所有文件,我单击 Blue,但如果我想在单击 1 时仅获取 1 中的文件,则它不起作用,因为 1 不是完整路径。

【问题讨论】:

  • 离题,但使用AfterSelect 事件而不是MouseClick

标签: c# .net winforms treeview


【解决方案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))

【讨论】:

  • Node 没有属性 AncestorsAndSelf。我应该从哪里得到它或如何使用它?严重性代码描述项目文件行抑制状态错误 CS1061“TreeNode”不包含“AncestorsAndSelf”的定义,并且找不到接受“TreeNode”类型的第一个参数的扩展方法“AncestorsAndSelf”(您是否缺少 using 指令或程序集参考?)
  • 我已经在答案中发布了AncestorsAndSelf 方法的链接。这是我写的扩展方法here
  • 我将 TreeViewExtensions 添加到我的代码中并删除了静态我得到错误,如果它是静态的。但仍然在事件 AfterSelect 这个 AncestorsAndSelf 不存在:e.Node.AncestorsAndSelf()
  • TreeViewExtensions 应该是静态的,因为它包含扩展方法。我已经用所需的usings 更新了链接代码。只需复制TreeViewExtensions.cs 中的代码,然后在项目中的任何位置使用即可。
  • 在你让它工作之后,阅读更多关于C# Extension methods的信息,它可以让你在没有继承的情况下向类添加一些方法。 :)
猜你喜欢
  • 1970-01-01
  • 2012-07-21
  • 2011-08-06
  • 1970-01-01
  • 1970-01-01
  • 2011-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多