listview中数据量大时带来的问题

studyprogram 2003-11-07 09:20:27
现在是程序动态生成listview的列的名称,然后从数据库一条条的读数据,然后将listview的每一列赋值,这样非常的慢,界面上看出来很难受? 怎么解决。谢谢
...全文
89 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
echocheng 2003-11-08
  • 打赏
  • 举报
回复
呵呵,楼上的回复我前两天搜贴时还看到过的
freshman2003 2003-11-08
  • 打赏
  • 举报
回复
下文为暴走-银狼所作,本人转帖。


采用常规方法处理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);
}
pscj 2003-11-08
  • 打赏
  • 举报
回复
用listview->items->beginupdate();
listview->items->endupdate()试试
qibo999 2003-11-07
  • 打赏
  • 举报
回复
你可以查一查以前有一篇关于listview快速排序的帖子,目的一样。
hzhxxx 2003-11-07
  • 打赏
  • 举报
回复
自己看看 bcb 的

emaples\VirtualListView 的工程,他告诉你 cb 步一样的表现数据方式

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧