Как я могу получить дочерний выбранный узел 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

Если я нажму Синий, я увижу больше узлов, например, под Синим.

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

Теперь, если я нажму на Blue, я получу имя выбранного узла Blue. selectedNode.Name будет синим

И если я нажму День, я получу selectedNode.Name День Но я хочу сделать так, чтобы если я нажму День, selectedNode будет Синий\День или СинийДень

И если в 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;
}

Идея состоит в том, что если я хочу получить все файлы в синем, я нажимаю на синий, но если я хочу получить только файлы в 1, когда я нажимаю на 1, это не работает, поскольку 1 не является полным путем.


person Abdul Jaja    schedule 02.02.2017    source источник
comment
Не по теме, но используйте событие AfterSelect вместо MouseClick.   -  person Reza Aghaei    schedule 03.02.2017


Ответы (1)


Каждый TreeNode имеет FullPath который получает путь от корневого узла дерева к текущему узлу дерева. Например, вы можете увидеть полный путь ко всем узлам дерева, как показано ниже:

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

Существует PathSeparator для TreeView, который получает или устанавливает строку-разделитель, используемую в пути к узлу дерева, которая по умолчанию равна \.

Если вы хотите лучше контролировать путь, вы можете использовать Ancestors или AncestorsAndSelf методы расширения.

В приведенном ниже примере я создал путь без корневого узла:

var pathWithoutRootNode = string.Join(@"\", 
    e.Node.AncestorsAndSelf().Where(x => x.Parent != null).Select(x => x.Text))
person Reza Aghaei    schedule 02.02.2017
comment
В Node нет свойства AncestorsAndSelf. Где мне его взять или как им пользоваться? Код серьезности Описание Ошибка состояния подавления строки файла проекта CS1061 «TreeNode» не содержит определения для «AncestorsAndSelf», и не удалось найти метод расширения «AncestorsAndSelf», принимающий первый аргумент типа «TreeNode» (вы пропустили директиву using или ссылка на сборку?) - person Abdul Jaja; 03.02.2017
comment
Я разместил ссылку на метод AncestorsAndSelf в ответ. Это метод расширения, который я написал здесь. - person Reza Aghaei; 03.02.2017
comment
Я добавил TreeViewExtensions в свой код и удалил статические ошибки, если они статические. Но все же в событии AfterSelect этого AncestorsAndSelf не существует: e.Node.AncestorsAndSelf() - person Abdul Jaja; 03.02.2017
comment
TreeViewExtensions должен быть статическим, поскольку он содержит методы расширения. Я обновил связанный код необходимыми usings. Просто скопируйте код в TreeViewExtensions.cs и используйте его где угодно в своих проектах. - person Reza Aghaei; 03.02.2017
comment
После того, как все заработает, прочтите подробнее о методах расширения C#, которые позволяют добавить некоторые методы в класс без наследования. :) - person Reza Aghaei; 03.02.2017
comment
Отлично работает. Спасибо. - person Abdul Jaja; 03.02.2017