ฉันจะรับโหนดที่เลือกลูก 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

ตอนนี้ถ้าฉันคลิกที่สีน้ำเงิน ฉันจะได้รับชื่อโหนดที่เลือก สีน้ำเงิน selectedNode.Name จะเป็น สีน้ำเงิน

และถ้าฉันคลิกที่ วัน จะได้ใน selectedNode.Name วัน แต่สิ่งที่ฉันต้องการทำคือ ถ้าฉันคลิกที่ วัน selectedNode จะเป็น บลู\เดย์ หรือ บลูเดย์

และถ้าภายใต้ วัน มีชื่อโหนดอื่น 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 event แทน 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
ไม่มีทรัพย์สินบรรพบุรุษและตนเองของโหนด จะหาได้จากที่ไหน หรือใช้อย่างไรคะ? รหัสความรุนแรงคำอธิบายข้อผิดพลาดสถานะการระงับบรรทัดไฟล์โครงการ CS1061 'TreeNode' ไม่มีคำจำกัดความสำหรับ 'AncestorsAndSelf' และไม่มีวิธีการขยาย 'AncestorsAndSelf' ที่ยอมรับอาร์กิวเมนต์แรกของประเภท 'TreeNode' สามารถพบได้ (คุณขาดคำสั่งการใช้หรือ อ้างอิงการประกอบ?) - 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