Как отсортировать дочерние узлы treeView

Я хочу отсортировать заданные дочерние узлы TreeView в алфавитном порядке.

Предположим, что мое дерево выглядит так:

  • firstNode1

    • secondNode1
    • thirdNode1
    • thirdNode2
    • третий узел3 ...
  • firstNode2

    • secondNode1
    • thirdNode1
    • thirdNode2
    • третий узел3 ...

Я хочу отсортировать узлы во втором узле каждого первого узла.

Как мне это сделать? - У меня есть красный о Custom Comparer, но не могу понять, как использовать его в моем случае.

1 ответ

Решение

Для обычной алфавитной сортировки просто вызовите встроенную сортировку:

treeView1.Sort();

и ты хороший.

Но иногда этого недостаточно. Тогда вам нужно написать собственный сортировщик. Это действительно просто; все, что нужно, это предоставить int за результат <, == или же >т.е. возврат -1, 0 или же 1 соответственно. Часто встроенные компараторы делают после небольшого массирования данных.

Вот пример пользовательского сортировщика. Это простой класс, реализующий IComparer интерфейс, который имеет только один метод..


Он готовит два текстовых узла для моего пользовательского сравнения перед вызовом обычной строки Compare метод.

Подготовка вставляет большое количество нулей, чтобы дополнить конечное число постоянной величиной.

Это всего лишь пример, но он отсортирует, например, имена по умолчанию от дизайнера в числовом / хронологическом порядке.


public class NodeSorter : System.Collections.IComparer
{
    public NodeSorter() { }

    public int Compare(object x, object y)
    {
        TreeNode tx = x as TreeNode;
        TreeNode ty = y as TreeNode;

        string s1 = tx.Text;
        while (s1.Length > 0 && Char.IsDigit(s1.Last())) s1 = s1.TrimEnd(s1.Last());
        s1 = s1 + tx.Text.Substring(s1.Length).PadLeft(12, '0');

        string s2 = tx.Text;
        while (s2.Length > 0 && Char.IsDigit(s2.Last())) s2 = s2.TrimEnd(s2.Last());
        s2 = s2 + ty.Text.Substring(s2.Length).PadLeft(12, '0');

        return string.Compare(s1, s2);
    }
}

Вы вызываете его, назначая его, а затем вызывая sort:

treeView1.TreeViewNodeSorter = new NodeSorter();
treeView1.Sort();

Результат:

введите описание изображения здесь введите описание изображения здесь введите описание изображения здесь

Это слегка измененная версия примера MSDN TreeNodeSorter. Помимо измененной логики сделайте примечание:

  • Пример старый и не соответствует IComparer интерфейс правильно. С появлением дженериков у нас обычно есть using System.Collections.Generic; пункт, и это скроет неуниверсальный IComparer интерфейс, приводящий к ошибкам компилятора, жалующийся на отсутствующие аргументы типа.

Добавление квалификации позаботится об этом..:

public class NodeSorter : System.Collections.IComparer
Другие вопросы по тегам