Slow listView Скорость сортировки - PullRequest
1 голос
/ 28 июня 2011

Описание

Я пишу приложение, что использовать listView. listView, который я использую - это простое представление списка, только я включаю doubleBufer, наследуя listView, и в конструкторе я пишу:

this->DoubleBuffer = true;

Итак, у меня есть несколько столбцов в моем listView, и когда я щелкаю по столбцу, мне нужно отсортировать элементы столбца. Все идет хорошо, когда у меня есть 500 элементов, но когда количество элементов в listView становится больше 50.000, и я нажимаю на столбец, чтобы отсортировать элементы в нем, мой список замораживается на 1 минуту и ​​реакция приложения останавливается. Ниже я представляю код сортировки.

Код сортировки

ref class DomainSorter : public System::Collections::IComparer {
        public:
            virtual int Compare( System::Object^ x, System::Object^ y) {
                System::Windows::Forms::ListViewItem^ lvi1 = static_cast<System::Windows::Forms::ListViewItem^>(o1);
                System::String^ str1 = lvi1->SubItems[COLUMN_DOMAIN]->Text;
                System::Windows::Forms::ListViewItem^ lvi2 = static_cast<System::Windows::Forms::ListViewItem^>(o2);
                System::String^ str2 = lvi2->SubItems[COLUMN_DOMAIN]->Text;

                int result = 0;

                if( lvi1->ListView->Sorting == System::Windows::Forms::SortOrder::Ascending)
                     result = System::String::Compare( str1, str2 );
                else result = System::String::Compare( str2, str1 );

                return result;
            }

        };

void OnColumnClick( )
{
    listViewDomainsInfo->BeginUpdate( );
    listViewDomainsInfo->ListViewItemSorter = gcnew DomainSorter( );
    if (listViewDomainsInfo->Sorting == SortOrder::Ascending)
    listViewDomainsInfo->Sorting = SortOrder::Descending;
    else listViewDomainsInfo->Sorting = SortOrder::Ascending;
    listViewDomainsInfo->EndUpdate( ); 
}

Вопрос

Как я могу увеличить скорость сортировки listView. (Я знал, что могу использовать виртуальный список, но не хотел) Можете ли вы помочь мне сделать этот код быстрее?

Ответы [ 2 ]

1 голос
/ 28 июня 2011

Если вы хотите более быструю сортировку, вам не следует использовать встроенную сортировку. Например:

  1. Перепишите свой поставщик сортировки для работы с ListViewItem вместо Object
  2. Сортировка предметов самостоятельно
  3. Затем позвоните listViewDomainsInfo->Items->Clear() и listViewDomainsInfo->Items->AddrRange()

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

0 голосов
/ 28 июня 2011

Единственное, что вы можете сделать, чтобы избежать невосприимчивого пользовательского интерфейса, это отсортировать список элементов в другом потоке (отделенном от ListView), а когда закончите, вызвать ListView.Items.Clear и ListView.Items.AddRange, чтобы добавить отсортированные элементы в ListView. Не уверен, что затраты на инфраструктуру управления потоками и синхронизации стоят усилий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...