列表视图排序速度慢



描述

我正在编写使用listView的应用程序。我使用的listView是一个简单的列表视图,只有我通过继承listView来打开doubleBufer,并且在构造函数中我写了:

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排序的速度。(我知道我可以使用虚拟列表,但我不想)你能帮我让这个代码更快地工作吗?

如果想要更快的排序,就不应该使用集成的排序行为。例如:

  1. 重写排序提供程序以使用ListViewItem而不是Object
  2. 自行对项目排序
  3. 然后呼叫listViewDomainsInfo->Items->Clear()listViewDomainsInfo->Items->AddrRange()

这应该会更快。还要注意,在这种情况下,您应该手动恢复可见项目的范围。

避免无响应UI的唯一方法是对另一个线程上的项目列表进行排序(与ListView解耦),完成后调用ListView.Items.ClearListView.Items.AddRange将排序后的项目添加到ListView。不确定线程管理和同步的基础架构开销是否值得。

最新更新