Сортировка элемента управления ListView, используя все его столбцы в C#

Вы можете сделать сортировку ListView, установив для свойства Sorting значение Ascending или Descending, но это займет дополнительную работу по сортировке элемента управления ListView с использованием всех его столбцов. Обычно элемент управления сортирует только его элементы, а не их подпозиции. Он даже не будет использовать подпункты для разрыва связей, когда элементы имеют один и тот же текст. В этом примере он использует оба элемента и подпозиции.

Чтобы изменить поведение сортировки элемента управления, вы должны создать класс, реализующий интерфейс IComparer. (Инструкции по реализации интерфейса см. В статье Внедрить интерфейс в C# .)

Чтобы изменить поведение сортировки элемента управления, вы должны создать класс, реализующий интерфейс IComparer. (Инструкции по реализации интерфейса см. В статье Внедрить интерфейс в C# .) ...

// Сравнивает два элемента ListView, используя все их столбцы.
public class ListViewAllColumnComparer : IComparer
{
    private SortOrder SortOrder;

    public ListViewAllColumnComparer(SortOrder sort_order)
    {
        SortOrder = sort_order;
    }

    // Сравнение двух списков ListViewItems.
    public int Compare(object object_x, object object_y)
    {
        // Получить объекты как ListViewItems.
        ListViewItem item_x = object_x as ListViewItem;
        ListViewItem item_y = object_y as ListViewItem;

        // Перебираем подпозиции.
        for (int i = 0; i < item_x.SubItems.Count; i++)
        {
            // Если item_y не входит в подпункты,
            // тогда это на первом месте.
            if (item_y.SubItems.Count <= i) return 1;

            // Получить подпозиции.
            string string_x = item_x.SubItems[i].Text;
            string string_y = item_y.SubItems[i].Text;

            // Сравните их.
            int result = CompareValues(string_x, string_y);

            if (result != 0) return result;
        }

        // Если мы доберемся здесь, мы получим точное совпадение.
        return 0;
    }

    // Сравните два элемента. Если они похожи
    // числа или даты, сравнить их как таковые.
    private int CompareValues(string string_x, string string_y)
    {
        // Сравните их.
        int result;
        double double_x, double_y;
        if (double.TryParse(string_x, out double_x) &&
            double.TryParse(string_y, out double_y))
        {
            // Обрабатываем как число.
            result = double_x.CompareTo(double_y);
        }
        else
        {
            DateTime date_x, date_y;
            if (DateTime.TryParse(string_x, out date_x) &&
                DateTime.TryParse(string_y, out date_y))
            {
                // Обработать как дату.
                result = date_x.CompareTo(date_y);
            }
            else
            {
                // Обработать как строку.
                result = string_x.CompareTo(string_y);
            }
        }

        // Вернуть правильный результат в зависимости от того,
        // сортируем по возрастанию или по убыванию.
        if (SortOrder == SortOrder.Ascending)
        {
            return result;
        }
        else
        {
            return -result;
        }
    }
}

Класс использует закрытую переменную SortOrder, чтобы отслеживать порядок сортировки. Это значение задается конструктором класса.

Класс использует закрытую переменную SortOrder, чтобы отслеживать порядок сортировки. Это значение задается конструктором класса.

...

Метод CompareValues сначала пытается сравнить значения как удвоения и даты. Например, поскольку строки «9» появляются после «100», но как цифры 9 до 100. Аналогично, как строки «10/10/2010» предшествуют «1/1/2009», но по мере того, как даты 10/10/2010 появляются после 1/1/2009. Сравнение значений как двойников и дат позволяет методу сортировать значения более значимо, чтобы они имели смысл для пользователя. Если значения не являются номерами или датами, код обрабатывает их как строки.

Следующий код показывает, как основная программа сортирует восходящий или нисходящий.

// Сортировка по возрастанию.
private void radAscending_Click(object sender, EventArgs e)
{
    // Создаем компаратор.
    lvwBooks.ListViewItemSorter =
        new ListViewAllColumnComparer(SortOrder.Ascending);

    // Сортировать.
    lvwBooks.Sort();
}

// Сортировка по убыванию.
private void radDescending_Click(object sender, EventArgs e)
{
    // Создаем компаратор.
    lvwBooks.ListViewItemSorter =
        new ListViewAllColumnComparer(SortOrder.Descending);

    // Сортировать.
    lvwBooks.Sort();
}

Когда вы нажимаете кнопку «По возрастанию», программа создает новый объект ListViewAllColumnComparer, передавая его конструктору параметр Ascending, чтобы сделать элементы сортировки сравнения в порядке возрастания. Затем он устанавливает сопоставление ListView элемента управления ListViewItemSorter. Элемент управления автоматически переупорядочивает его элементы.

Источник: http://csharphelper.com/blog/2014/09/sort-a-listview-control-using-all-of-its-columns-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Adblock
detector