在ListView中操作大量数据

  采用常规方法处理ListView,在数据量大时无论是还是用了BeginUpdata和EndUpdata()还是处理WM_EraseBkgnd信息都不会得到理想的效果,那答案是什么呢?  
  嗯,采用所谓Virtual   ListView。  
  说起来很神秘,其实点通了很简单。  
  在于把ListView->OwnerData设为true,然后直接设置  
  ListView->Items->Count为数据总数,实际的数据可以保在任意其它速度较快且可直接索引的容器里(如STL中的vector),然后关键是在OnData事件中写入代码通过Item->Index从容器中(如vector)取出数据,然后用  
  Item->Caption   =   ???;  
  Item->SubItems->Add(???);  
  Item->SubItems->Add(???);  
  来动态的写入数据到ListView用于UI显示,如此Virtual   ListView即完成.  
   
  一个完整的简单例子如下:  
  /*Unit1.h*/  
  //---------------------------------------------------------------------------  
   
  #ifndef   Unit1H  
  #define   Unit1H  
  //---------------------------------------------------------------------------  
  #include   <Classes.hpp>  
  #include   <Controls.hpp>  
  #include   <StdCtrls.hpp>  
  #include   <Forms.hpp>  
  #include   <ComCtrls.hpp>  
  #include   <vector>  
  using   namespace   std;  
  //---------------------------------------------------------------------------  
  struct   ListViewData  
  {  
          AnsiString   Caption;  
          AnsiString   SubItems1;  
          AnsiString   SubItems2;  
          AnsiString   SubItems3;  
  };  
  class   TForm1   :   public   TForm  
  {  
  __published: //   IDE-managed   Components  
          TListView   *ListView1;  
          void   __fastcall   ListView1Data(TObject   *Sender,   TListItem   *Item);  
  private: //   User   declarations  
          vector<ListViewData*>   m_lvDataVector;  
  public: //   User   declarations  
          __fastcall   TForm1(TComponent*   Owner);  
          __fastcall   ~TForm1();          
  };  
  //---------------------------------------------------------------------------  
  extern   PACKAGE   TForm1   *Form1;  
  //---------------------------------------------------------------------------  
  #endif  
   
  /*unit1.cpp*/  
  //---------------------------------------------------------------------------  
   
  #include   <vcl.h>  
  #pragma   hdrstop  
   
  #include   "Unit1.h"  
  //---------------------------------------------------------------------------  
  #pragma   package(smart_init)  
  #pragma   resource   "*.dfm"  
  TForm1   *Form1;  
  //---------------------------------------------------------------------------  
  __fastcall   TForm1::TForm1(TComponent*   Owner)  
          :   TForm(Owner)  
  {  
          ListView1->OwnerData   =   true;  
          const   int   iListViewCount   =   5000;  
          ListView1->Items->Count   =   iListViewCount;  
          for(int   i   =   0;   i   <   iListViewCount;   ++i)   {  
                  ListViewData   *plvData   =   new   ListViewData;  
                  plvData->Caption   =   "Caption"   +   AnsiString(i);  
                  plvData->SubItems1   =   "SubItems1"   +   AnsiString(i);  
                  plvData->SubItems2   =   "SubItems2"   +   AnsiString(i);  
                  plvData->SubItems3   =   "SubItems3"   +   AnsiString(i);  
                  m_lvDataVector.push_back(plvData);  
          }  
  }  
   
  __fastcall   TForm1::~TForm1()  
  {  
          int   iCount   =   ListView1->Items->Count;  
          for(int   i   =   0;   i   <   iCount;   ++i)   {  
                  ListViewData   *plvData   =   m_lvDataVector[i];  
                  delete   plvData;  
          }  
  }  
  //---------------------------------------------------------------------------  
   
  void   __fastcall   TForm1::ListView1Data(TObject   *Sender,   TListItem   *Item)  
  {  
          ListViewData   *plvData   =   m_lvDataVector[Item->Index];  
          Item->Caption   =   plvData->Caption;  
          Item->SubItems->Add(plvData->SubItems1);  
          Item->SubItems->Add(plvData->SubItems2);  
          Item->SubItems->Add(plvData->SubItems3);  
  }  
  //---------------------------------------------------------------------------   
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值