Как сделать сортировку в столбцах у `ListView`?

432
12 апреля 2017, 11:29

Собственно есть listview, как сделать сортировку по данным в столбцах? Есть столбец процессов - нужно по нажатию на колонку, сделать сортировку по алфавиту. Есть столбец "память" - нужно при нажатии на заголовок столбца, сделать сортировку. Так как это сделать?)

Answer 1

Сначала добавим свой класс, назовем его ListViewColumnComparer, реализуем интерфейс IComparer и реализуем из него единственный метод, который в нем содержится Compare:

class ListViewColumnComparer : IComparer
{
    public int ColumnIndex { get; set; }
    public ListViewColumnComparer(int columnIndex)
    {
        ColumnIndex = columnIndex;
    }
    public int Compare(object x, object y)
    {
        try
        {
            return String.Compare(
            ((ListViewItem)x).SubItems[ColumnIndex].Text,
            ((ListViewItem)y).SubItems[ColumnIndex].Text);
        }
        catch (Exception) // если вдруг столбец пустой (или что-то пошло не так)
        {
            return 0;
        }            
    }
}

Добавить обработчик на нажатие колонки в который запихнем наш класс-компаратор:

private void listView1_ColumnClick(object sender, ColumnClickEventArgs e)
{
   this.listView1.ListViewItemSorter = new ListViewColumnComparer(e.Column);
}

В принципе всё, будет сортировать в тех столбцах, на которых кликнули мышкой. Можно добавить обработку на индекс сортируемого столбца внутри конструктора ListViewColumnComparer, можно вынести в отдельную переменную значение ASC и DESC, чтобы еще и в обратном порядке сортировать. Идея тут ясна - можно развивать.

  • ListView.ListViewItemSorter - возвращает или задает блок сравнения сортировки для данного элемента управления.

  • Интерфейс IComparer - предоставляет метод, который сравнивает два объекта.

Answer 2

Нужно в событие listview_ColumnClick добавить компаратор.

Здесь и здесь достаточно понятно написано, как это сделать.

READ ALSO
Ошибка при запуске проекта ASP. NET Core 1.1

Ошибка при запуске проекта ASP. NET Core 1.1

При запуске проекта появляется окно со следующей ошибкой "ошибка при попытке определить идентификатор процесса dotnetexe", запускаю на IIS в 17 студии

241
Удалить пустые столбцы DataGridView

Удалить пустые столбцы DataGridView

Есть таблица DataGridView с контактамиКаждый столбец - способ связи (телефон, почта, ваттсапп ect)

584
Windows phone: как сделать автоматический скролл страницы?

Windows phone: как сделать автоматический скролл страницы?

Добавляю динамически на страницу новые элементыПри этом если они не помещаются и уползают вниз, то я не могу до них добраться, так как скроллинг...

376
Unity. Как сделать “тень” персонажа, что будет выполнять все его действия

Unity. Как сделать “тень” персонажа, что будет выполнять все его действия

Есть игра - платформерПосле прохождения локации нужно сделать , чтобы при следующем запуске этой локации помимо основного игрока по локации...

346