การเรียงลำดับ treeview Nodes[0] ใหม่หลังจากเติมข้อมูลแล้วเท่านั้น

ฉันมีต้นไม้ดังต่อไปนี้:

Animals
 |
 |___Zebra
 |    |__Head
 |    |__Arms
 |    |__Legs
 |   
 |___Monkey
      |__Head
      |__Arms
      |__Legs

สัตว์แต่ละตัวมีหมายเลข ID เก็บไว้ในช่อง Tag และชื่ออยู่ในช่องชื่อของโหนด ฉันต้องการกดปุ่มที่เขียนว่า "Sort by ID" และให้ "Zebra" ด้านบนกลายเป็น "14" เป็นต้น จากนั้น รีสอร์ทเป็นตัวเลข แต่อยากให้เด็กๆ อยู่ในลำดับ ศีรษะ แขน ขา เมื่อฉันใช้โค้ดต่อไปนี้ มันใช้งานได้ แต่ยังเรียงลำดับหัว แขน ขา เป็นแขน หัว ขาด้วย ฉันได้ลองใช้ NodeSorter แล้ว แต่ไม่ได้รับผลลัพธ์ที่แตกต่างออกไป ฉันยังใหม่มากกับ C# ดังนั้นฉันอาจจะใช้งานมันไม่ถูกต้อง :) ฉันยังใช้โหนดที่กำหนดเองพร้อมช่องพิเศษสองสามช่องเพื่อจัดเก็บข้อมูลและค่าบูลีน นั่นคือสิ่งที่ "JacksNode" อ้างถึงด้านล่างนี้

นี่คือรหัส:

public static void sortByAnimalID(TreeView tv)
    {
        tv.BeginUpdate();
        foreach (TreeNode treeNode in tv.Nodes[0].Nodes)
        {
            if (((JacksNode)treeNode).IsAnimal)
            {
                treeNode.Text = Convert.ToString(treeNode.Tag);
                treeNode.Name = Convert.ToString(treeNode.Tag);
            }
        }
        tv.Sort();
        tv.EndUpdate();
    }

มีความคิดเห็นเกี่ยวกับสิ่งที่ฉันทำผิดหรือไม่? ฉันค้นหาเว็บเป็นเวลาสองสัปดาห์และมีบทความ Treeview มากมายจนล้นหลาม อย่างไรก็ตามไม่มีใครมีความเฉพาะเจาะจงเรื่องนี้ ขอบคุณเพื่อน ๆ / gals สำหรับข้อเสนอแนะใด ๆ


person Johnny Deese    schedule 19.09.2011    source แหล่งที่มา


คำตอบ (1)


ใช้คุณสมบัติ TreeNode.Level เพื่อหาวิธีเปรียบเทียบคุณสมบัติของโหนด แบบนี้:

    private void SortButton_Click(object sender, EventArgs e) {
        if (treeView1.TreeViewNodeSorter == null) {
            treeView1.TreeViewNodeSorter = new NodeSorter();
        }
    }
    private class NodeSorter : System.Collections.IComparer {
        public int Compare(object x, object y) {
            TreeNode node1 = (TreeNode)x;
            TreeNode node2 = (TreeNode)y;
            if (node1.Level == 1) {
                return Convert.ToInt32(node1.Tag).CompareTo(Convert.ToInt32(node2.Tag));
            }
            else {
                return node1.Index.CompareTo(node2.Index);
            }
        }
    }
person Hans Passant    schedule 19.09.2011
comment
ฉันเอาไฟล์ Convert.ToInt32 ออกมา (จริงๆ แล้วฉันใช้ alpha-nums) และมันทำงานได้ดีสำหรับการแปลงเป็น Animal ID อย่างไรก็ตาม หากฉันใช้มันหลังจากสลับชื่อกลับเข้าไปแล้ว มันจะไม่เรียงลำดับอีก ไม่เป็นไร ฉันสามารถใช้เมธอด treeview.Sort() พื้นฐานกับอันนั้นได้และมันก็ใช้ได้ดี จึงมีปุ่มสองปุ่มแทนที่จะเป็นปุ่มเดียว ไม่ใช่เรื่องใหญ่สำหรับสิ่งที่ฉันทำ ฉันเคยลองใช้วิธีแก้ปัญหานี้มาก่อน แต่ฉันไม่ได้ใช้การเปรียบเทียบดัชนีอื่นในตอนท้าย ฉันคือนิว!! ฮ่าฮ่า ขอบคุณฮันส์ ดูเหมือนว่าจะได้ผล - person Johnny Deese; 19.09.2011