Bagaimana saya bisa mendapatkan node pilihan anak TreeView tetapi juga node di atas?

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

    if (selectedNode != null)
    {

    }
}

Jika saya memiliki misalnya simpul root:

World

Ketika saya mengkliknya, saya melihat node ini:

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

Jika saya mengklik Biru saya akan melihat lebih banyak node di bawah Biru misalnya

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

Sekarang jika saya mengklik Biru saya akan mendapatkan nama node yang dipilih Biru. selectedNode.Name akan menjadi Biru

Dan jika saya mengklik Hari akan masuk selectedNode.Name Hari Namun yang ingin saya lakukan adalah jika saya mengklik Hari selectedNode menjadi Blue\Day atau BlueDay

Dan jika di bawah Hari ada nama node lain 1 dan saya klik 1 maka di selectedNode.Name saya ingin untuk melihat BlueDay1 atau saya lebih suka Blue\Day\1

Saya ingin \\ ini agar saya dapat menggunakannya sebagai nama direktori. Masalahnya adalah saya menggunakan selectedNode.Name sebagai direktori untuk mendapatkan file:

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;
    }
}

Jika saya mengklik Biru maka tidak apa-apa semua file di bawah Biru termasuk sub direktori. Tetapi jika saya mengklik 1 dan ada file di 1 maka tidak akan ada file apa pun karena saya memerlukan nama path lengkap Blue\Day\1 untuk mendapatkan file dari 1.

Beginilah cara saya mendapatkan filenya

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;
}

Idenya adalah jika saya ingin mendapatkan semua file di bawah Biru saya klik Biru tetapi jika saya hanya ingin mendapatkan file di 1 ketika saya mengklik 1 itu tidak berfungsi karena 1 bukanlah jalur yang lengkap.


person Abdul Jaja    schedule 02.02.2017    source sumber
comment
Di luar topik, tetapi gunakan acara AfterSelect, bukan MouseClick.   -  person Reza Aghaei    schedule 03.02.2017


Jawaban (1)


Setiap TreeNode memiliki FullPath yang mendapatkan jalur dari simpul pohon akar ke simpul pohon saat ini. Misalnya Anda dapat melihat jalur lengkap semua node untuk pohon seperti pohon di bawah ini:

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

Ada PathSeparator karakter untuk TreeView yang mendapatkan atau menyetel string pembatas yang digunakan jalur simpul pohon, yaitu \ secara default.

Jika Anda ingin memiliki kontrol lebih besar atas jalur tersebut, Anda dapat menggunakan Ancestors atau AncestorsAndSelf metode ekstensi.

Dalam contoh yang saya berikan di bawah ini saya telah membuat jalur tanpa simpul akar:

var pathWithoutRootNode = string.Join(@"\", 
    e.Node.AncestorsAndSelf().Where(x => x.Parent != null).Select(x => x.Text))
person Reza Aghaei    schedule 02.02.2017
comment
Tidak ada properti LeluhurAndSelf dari Node. Di mana saya harus mendapatkannya atau bagaimana cara menggunakannya? Kode Keparahan Deskripsi Kesalahan Status Penindasan Jalur File Proyek CS1061 'TreeNode' tidak berisi definisi untuk 'AncestorsAndSelf' dan tidak ada metode ekstensi 'AncestorsAndSelf' yang menerima argumen pertama bertipe 'TreeNode' yang dapat ditemukan (apakah Anda melewatkan arahan penggunaan atau referensi perakitan?) - person Abdul Jaja; 03.02.2017
comment
Saya telah memposting tautan metode AncestorsAndSelf sebagai jawaban. Ini adalah metode ekstensi yang saya tulis di sini. - person Reza Aghaei; 03.02.2017
comment
Saya menambahkan TreeViewExtensions ke kode saya dan menghapus statis. Saya mendapat kesalahan jika statis. Namun tetap saja dalam acara AfterSelect LeluhurAndSelf ini tidak ada: e.Node.AncestorsAndSelf() - person Abdul Jaja; 03.02.2017
comment
TreeViewExtensions harus statis karena berisi metode ekstensi. Saya telah memperbarui kode tertaut dengan usings yang diperlukan. Cukup salin kode di TreeViewExtensions.cs dan gunakan di mana saja di proyek Anda. - person Reza Aghaei; 03.02.2017
comment
Setelah Anda membuatnya berfungsi, baca selengkapnya tentang Metode Ekstensi C# yang memungkinkan Anda melakukannya tambahkan beberapa metode ke kelas tanpa warisan. :) - person Reza Aghaei; 03.02.2017
comment
Bekerja dengan baik. Terima kasih. - person Abdul Jaja; 03.02.2017