我在编写应用程序使用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
排序的速度。 (我知道我可以使用虚拟列表,但我不想要)你可以帮助我让这段代码更快地运行吗?
答案 0 :(得分:1)
如果您想要更快的排序,则不应使用集成排序行为。 例如:
ListViewItem
代替Object
listViewDomainsInfo->Items->Clear()
和listViewDomainsInfo->Items->AddrRange()
这应该更快。另请注意,在这种情况下,您应手动恢复可见项目范围。
答案 1 :(得分:0)
你唯一能做的就是避免无响应的用户界面是对另一个线程上的项目列表进行排序(与ListView
分离),完成后调用ListView.Items.Clear
和ListView.Items.AddRange
来添加已排序的项目到ListView
。不确定线程管理和同步的基础结构开销是否值得付出努力。