Menyortir ulang Node tampilan pohon[0] hanya setelah diisi

Saya memiliki pohon berikut:

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

Setiap hewan memiliki nomor ID yang disimpan di bidang Tag dan nama mereka ada di bidang Nama simpul. Saya ingin menekan tombol yang bertuliskan "Urutkan berdasarkan ID" dan ubah "Zebra" di atas menjadi "14" dll, lalu resor secara numerik. Namun, saya ingin anak-anak tetap menjaga ketertiban kepala, lengan, kaki. Ketika saya menggunakan kode berikut, itu berfungsi, tetapi juga mengurutkan ulang kepala, lengan, kaki menjadi lengan, kepala, kaki. Saya sudah mencoba NodeSorter, tetapi tidak mendapatkan hasil yang berbeda. Saya juga sangat baru mengenal C# jadi saya mungkin salah menerapkannya. :) Saya juga menggunakan node khusus dengan beberapa kolom tambahan untuk menyimpan data dan nilai boolean. Itulah yang dimaksud dengan "JacksNode" di bawah.

Berikut kodenya:

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

Adakah ide tentang kesalahan yang saya lakukan? Saya telah menelusuri web selama dua minggu dan kewalahan dengan semua artikel tampilan pohon. Namun, belum ada satupun yang sespesifik ini. Terima kasih teman-teman atas sarannya.


person Johnny Deese    schedule 19.09.2011    source sumber


Jawaban (1)


Gunakan properti TreeNode.Level untuk mengetahui cara membandingkan properti node. Seperti ini:

    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
Saya mengeluarkan convert.ToInt32 (saya sebenarnya menggunakan angka alfa) dan berfungsi dengan baik untuk konversi ke ID Hewan. Namun jika saya menggunakannya setelah menukar kembali Nama, itu tidak dapat diurutkan lagi. Tapi tidak apa-apa. Saya dapat menggunakan metode dasar treeview.Sort() dan itu berfungsi dengan baik. Jadi dua tombol, bukan satu. Bukan masalah besar untuk apa yang saya lakukan. Saya sudah mencoba solusi ini sebelumnya, tetapi pada akhirnya saya tidak menggunakan perbandingan Indeks yang lain. Saya seorang Newb!! HaHa Terima kasih Hans, sepertinya ini akan berhasil. - person Johnny Deese; 19.09.2011