数据量大时,ListView更新更快的方法
2004-11-03 13:53
288 查看
采用常规方法处理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);
}
//---------------------------------------------------------------------------
btw,cker指点:
我现在觉得tlistview 和 tTreeView比较烂。
最近正在熟悉一个号称最好的Tree和list控件,非常的棒。开放源码,
www.delphi-gems.com的virtual trees
同样是使用所谓的Virtual技术....,这个控件是我接触BCB和Delphi以来见过的最好的控件。
嗯,采用所谓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);
}
//---------------------------------------------------------------------------
btw,cker指点:
我现在觉得tlistview 和 tTreeView比较烂。
最近正在熟悉一个号称最好的Tree和list控件,非常的棒。开放源码,
www.delphi-gems.com的virtual trees
同样是使用所谓的Virtual技术....,这个控件是我接触BCB和Delphi以来见过的最好的控件。
相关文章推荐
- Android开发中ListView数据更新显示的解决方法
- Android——Listview不用notifydatasetchanged更新数据的方法
- 安卓探究ListView+Adapter数据在工作线程中更新引发的crash以及解决方法(一)
- Android——Listview更新数据的三种方法
- android studio编程时出现的错误:ListView重新载入后,更新数据或者再次进入该ListView加载数据,数据不显示 解决方法
- 安卓探究ListView+Adapter数据在工作线程中更新引发的crash以及解决方法(三)
- android使用notifyDataSetChanged()方法,adapter的数据更新了,但是ListView的内容没有更新;
- 安卓探究ListView+Adapter数据在工作线程中更新引发的crash以及解决方法(二)
- android使用notifyDataSetChanged()方法,adapter的数据更新了,但是ListView的内容没有更新
- android使用notifyDataSetChanged()方法更新数据失效,adapter的数据更新了,但是ListView的内容没有更新;
- android使用notifyDataSetChanged()方法,adapter的数据更新了,但是ListView的内容没有更新;
- 关于ListView中notifyDataSetChanged()刷新数据不更新原因
- mvc3的SaveChanges()方法无效,数据并没有更新!
- 解决scrollview中包含listview请求数据后直接定位到页面底部的方法
- ListView notifyDataSetChanged不起作用 数据不更新的原因
- ListView 获取数据和删除一行后更新
- hibernate persist update 方法没有正常工作(不保存数据,不更新数据)
- SQLServer批量更新两个关联表数据的方法
- android 更新listview 其中一行的数据显示