Alan Burkhart Ответов: 2

Как отсортировать элемент управления winforms listview?


Мой текущий проект включает в себя ownerdraw ListView с 6 столбцами, используемыми только в детальном представлении. Я редко использую ListView, поэтому, скорее всего, просто упускаю что-то очевидное. Мне не нужно сортировать по каждому столбцу. Достаточно отсортировать весь список (на col 0). Форма загружается со свойством ListView.Sorting, установленным в значение по возрастанию. У меня есть ComboBox для выбора порядка сортировки. Я не использую ни один. Просто восходящий / нисходящий.

Но когда я переключаюсь между восходящим / нисходящим, все, что я получаю, - это короткое мерцание и отсутствие изменений в порядке сортировки. Вот код для переключения свойства сортировки:

Private Sub cmb_Sorting_SelectionChangeCommitted() _
    Handles cmb_Sorting.SelectionChangeCommitted
    Try
        Select Case cmb_Sorting.SelectedIndex
            Case 0
                lvFiles.Sorting = SortOrder.Ascending
            Case 1
                lvFiles.Sorting = SortOrder.Descending
        End Select

    Catch ex As Exception
        MsgBox(ex.ToString)
    End Try
End Sub


Что я уже пробовал:

Честно говоря, я не знал, что и попробовать. Я добавил msgbox, чтобы показать мне свойство сортировки каждый раз, когда я выбираю из списка, и, по-видимому, порядок сортировки меняется. Но изменение не отражается на контроле. Я делаю что-то не так?

Спасибо - АБ

DerekT-P

Не могли бы вы предоставить свою разметку и серверный код, пожалуйста; нам нужно будет понять, когда/как вы заполняете listview и т. д.

Alan Burkhart

Это настольное приложение Windows Forms.
1. заимствования cmd.exe кратко, чтобы получить список каталогов, затем выполняет поиск совпадений по именам файлов и / или тексту. Это делается в фоновом потоке.
2. Каждый dir ищется, и если совпадения найдены, создается новая listviewgroup (с путем dir в качестве его текста), и элементы назначаются группе.

DerekT-P

Я предполагаю, что вы прошли через код, чтобы проверить .Метод сортировки действительно вызывается? Вы определили какой-либо пользовательский метод сравнения? Пробовали ли вы явно вызвать метод .Sort() после установки последовательности сортировки для принудительной повторной сортировки? И вы проверили, что форма не перезагружает данные каждый раз, когда изменяется выбор поля со списком?
(Кстати, зачем использовать отдельный поток с cmd.exe просто чтобы поискать в некоторых каталогах совпадающие имена файлов??)

Alan Burkhart

Что касается использования cmd.exe, это был быстрый и простой способ получить список каталогов, не имея дела с какими-либо нарушениями доступа. И я должен добавить, что это не производственный код. Это просто утилита для моего собственного использования. Я этим не зарабатываю на жизнь.

Я попытался решить проблему сортировки, создав отдельный проект, в котором не было ничего, кроме ListView и 2 радиокнопок для выбора порядка сортировки (элементы, добавленные в конструктор). Тот же результат.

Общественного Класса Form1
Private Sub RadioButton1_CheckedChanged() Обрабатывает RadioButton1.CheckedChanged
LV.сортировка = сортировщик.Восходящий
Конец Подводной Лодки

Private Sub RadioButton2_CheckedChanged() Обрабатывает RadioButton2.CheckedChanged
LV.сортировка = сортировщик.Нисходящий
Конец Подводной Лодки
End Класса

Насколько я понимаю, установка свойства сортировки-это все, что требуется, если только я не выполняю пользовательскую сортировку, а это не так. Мне нужно только отсортировать имена файлов.

2 Ответов

Рейтинг:
2

Gerry Schmitz

Вы меняете (или пытаетесь) изменить порядок сортировки в "обработчике событий", который также "имеет дело с отображением". У вас, вероятно, есть какое-то событие "раздор".

Вам нужно переосмыслить, почему и когда ваше приложение меняет порядок сортировки (а не пользователь).


Alan Burkhart

Я создал временный проект, состоящий из 2 радиокнопок и 2-столбцового списка. В событии загрузки формы я заполнил listview, выполнив цикл через FontFamilies на моей машине. Col 0 получил имена, а col 1 был заполнен длиной строки имен. Радиокнопки должны были выбрать порядок сортировки. Результаты были те же самые. Экран списка мигнул, но не стал перебирать данные. Но свойство сортировки меняется каждый раз, когда я нажимаю кнопку radiobutton.

Пожалуйста, объясните, что вы подразумеваете под "конфликтом событий"." Спасибо.

Рейтинг:
16

DerekT-P

Мы все еще не видели код, который заполняет ваш listview. В моем простом тесте просто меняю SortOrder сразу же перерисовывает listview в новой последовательности. Однако он сортирует по своему .Text свойство элемента, а не на подпункты (столбцы). Попробуйте установить Item.Text значение равно значению в Столбцах(0), и вы должны найти, что все хорошо.