描述
我正在编写使用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
排序的速度。(我知道我可以使用虚拟列表,但我不想)你能帮我让这个代码更快地工作吗?
如果想要更快的排序,就不应该使用集成的排序行为。例如:
- 重写排序提供程序以使用
ListViewItem
而不是Object
- 自行对项目排序
- 然后呼叫
listViewDomainsInfo->Items->Clear()
和listViewDomainsInfo->Items->AddrRange()
这应该会更快。还要注意,在这种情况下,您应该手动恢复可见项目的范围。
避免无响应UI的唯一方法是对另一个线程上的项目列表进行排序(与ListView
解耦),完成后调用ListView.Items.Clear
和ListView.Items.AddRange
将排序后的项目添加到ListView
。不确定线程管理和同步的基础架构开销是否值得。