慢listView排序速度

时间:2011-06-28 10:06:32

标签: .net winforms sorting listview c++-cli

描述

我在编写应用程序使用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 个答案:

答案 0 :(得分:1)

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

  1. 重写您的排序提供商以使用ListViewItem代替Object
  2. 自行排序
  3. 然后致电listViewDomainsInfo->Items->Clear()listViewDomainsInfo->Items->AddrRange()
  4. 这应该更快。另请注意,在这种情况下,您应手动恢复可见项目范围。

答案 1 :(得分:0)

你唯一能做的就是避免无响应的用户界面是对另一个线程上的项目列表进行排序(与ListView分离),完成后调用ListView.Items.ClearListView.Items.AddRange来添加已排序的项目到ListView。不确定线程​​管理和同步的基础结构开销是否值得付出努力。