关于ListView的添加数据的问题

zombieLi 2003-02-04 11:28:26
我的ListView里的数据需要动态变化,而每次生成这些数据都比较费时,我用触发OnData事件来显示数据,但会造成数据没有添加完时就读取数据,造成了数据不一致,该如何解决
...全文
174 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zombieLi 2003-02-09
  • 打赏
  • 举报
回复
结了,不用这种方法啦
shclhs 2003-02-07
  • 打赏
  • 举报
回复
可是用我的那个方法更新5000条数据时还不到一秒,怎么会不行,你的代码可能有点问题。你贴出来看看。
zombieLi 2003-02-06
  • 打赏
  • 举报
回复
有时多,有时少,多则几百条,少则几条
zombieLi 2003-02-06
  • 打赏
  • 举报
回复
大概也就1,2秒时间吧
shclhs 2003-02-06
  • 打赏
  • 举报
回复
查询需要定时去做????????
每两次查寻时间是多少
shclhs 2003-02-06
  • 打赏
  • 举报
回复
每次查询的记录大概有多少条
zombieLi 2003-02-05
  • 打赏
  • 举报
回复
to shclhs(龙海神):
我的用法和你差不多,只不过你的vector我用TList来代替了,就是应为这样,因为TList的数据是变化的,有时数据还没有清除干净或是没有添加完成,就显示了,造成了数据的显示与实际的不一致,我用了几种方法,都不能解决,所以向各位大侠来请教了
shclhs 2003-02-05
  • 打赏
  • 举报
回复
ListView在插入或删除大量数据时会出现速度很慢的情况,所一要用到虚你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);
}
//---------------------------------------------------------------------------

zombieLi 2003-02-05
  • 打赏
  • 举报
回复
是这样的,我查询的数据要显示在ListView中,但这个查询需要定时去做,由于刷新速度问题,我在ListView的OnData事件中来显示数据,由于数据的不同步问题,造成了ListView中的数据混乱,不知道该如何处理了。
恳请各位指点了
shclhs 2003-02-05
  • 打赏
  • 举报
回复
我昨天晚上就看到这个问题了,但没进来,怪不得得别人不回答你,别人就没法理解你的意思。
shclhs 2003-02-05
  • 打赏
  • 举报
回复
你还是先把你的问题说清楚。动态变化怎么变,怎么费时,数据没有添加完时就读取数据????

13,825

社区成员

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

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