Повторная сортировка узлов дерева [0] только после заполнения

У меня есть следующее дерево:

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

У каждого животного есть идентификационный номер, хранящийся в поле «Тег», а их имя находится в поле «Имя» узла. Я хочу нажать кнопку с надписью «Сортировать по идентификатору», чтобы «Зебра» выше превратилась в «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();
    }

Любые идеи о том, что я делаю неправильно? Я искал в Интернете две недели и был перегружен всеми статьями с древовидной структурой. Однако ни один из них не был таким конкретным. Спасибо ребятам/девушкам за любые предложения.


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 (на самом деле я использую буквенно-цифровые обозначения), и он отлично работает для преобразования в Animal ID. Однако, если я использую его после замены имен обратно, он снова не сортируется. Но это нормально. Я могу использовать базовый метод treeview.Sort() для этого, и он отлично работает. Две кнопки вместо одной. Не так уж и много для того, чем я занимаюсь. Я пробовал это решение раньше, но я не использовал сравнение else Index в конце. Я Новичок!! Ха-ха, спасибо, Ганс, похоже, это сработает. - person Johnny Deese; 19.09.2011