CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  数据库

删除记录后,如何高效地刷新界面?

楼主Pandona(口袋妖怪)2006-03-12 01:03:19 在 VC/MFC / 数据库 提问

我做一个类似电子表格的程序,以ListCtrl呈现,记录产品信息,字段有:产品编号,产品名,价格,供应商....,数据库是Access   xp建的,采用ADO访问。  
  有这样的需求:  
  1:程序架构是:界面层与数据层,数据层简单地封装了操作产品数据库的接口,界面层中不保存数据,必须通过数据层的接口访问数据  
  2:以产品编号为主键,表中不允许有重复产品记录  
  3:存储着2万条记录  
   
  应用场景描述:  
  用户在界面一次选中几条产品记录R1,R2,R3,Rx,然后点选择删除;  
   
  问题:  
  界面层调用数据层删除数据的方法,返回成功后,要刷新界面,因为数据量很多,重新遍历一篇数据库,再一个一个显示在界面,效率将很低,界面会进入不短的“不响应”状态。  
  大家有什么好办法解决呢? 问题点数:100、回复次数:13Top

1 楼Pandona(口袋妖怪)回复于 2006-03-12 01:03:41 得分 0

我想了另一种方法:用户在删除选中的记录时,界面层记录这些记录所在的行,当数据层返回成功后,界面层再将这个行删掉。只是这样有一个问题,你并不知道用户会选中多少条记录,如果用户选择一条记录,则比较好办,如果选太多,或者他用Ctrl+A,这样就会给我造成很大的麻烦,效率也不一定比上一种高到那儿去;我主要是不希望在界面层存很多的额外的数据;eg:用户选了19999个记录,界面层用一个vector存下它们的行号,成功删除这些记录后,界面层根据这个vector刷新界面,也很慢啊;Top

2 楼striking(庸人自扰)回复于 2006-03-12 01:08:11 得分 100

ListCtrl采用虚拟列表的方法,   效率不会低的。Top

3 楼striking(庸人自扰)回复于 2006-03-12 01:15:29 得分 0

就是   listctrl   的LVN_GETDISPINFO   事件。  
   
  所以当你删除记录的时候,   刷新只是你能看到的listctrl的大小。  
   
  效率不会低的。Top

4 楼dawndove(dove)回复于 2006-03-12 01:17:23 得分 0

我也有类似的问题,数据量大的时候是有些慢。不过还没有碰到“不响应”的情况。Top

5 楼Pandona(口袋妖怪)回复于 2006-03-12 12:50:00 得分 0

关键是对记录集作了某些操作(如删除)后,又得重新遍历一遍数据库,这个很慢啊.Top

6 楼Pandona(口袋妖怪)回复于 2006-03-12 12:50:48 得分 0

有没有办法可以不重新遍历数据库呢?Top

7 楼striking(庸人自扰)回复于 2006-03-12 13:45:24 得分 0

虚拟列表不需要遍历数据库的。Top

8 楼striking(庸人自扰)回复于 2006-03-12 14:00:48 得分 0

你可以baidu搜索   虚拟列表   listctrl  
   
  Top

9 楼striking(庸人自扰)回复于 2006-03-12 14:19:44 得分 0

简单的讲一下虚拟列表的原理  
   
  数据库有10000条记录,   那么listctrl为了显示数据库的记录,也要有10000条记录  
   
  listctrl在insertitem的时候,   每个item的   pszText应该是   如lvi.pszText   =   LPSTR_TEXTCALLBACK;意思是回调。   而不是直接赋值给listctrl。  
   
  所以需要处理   listctrl   的LVN_GETDISPINFO   事件。  
   
  这个事件告诉listctrl   ,   如果当前listctrl的显示范围是100-1000条记录之间,    
  那么你就去数据库的100-1000直接去取数据。    
   
  这样listctrl事实上只需要维护当前list能显示容纳得下记录范围。  
   
  当你删除   数据库的不连续的记录时,   只需删除数据库相应的记录,   然后在list上  
  连续删几行就可以了。  
   
  重新刷新一下,   告诉list重新取数据。    
   
  所以效率来讲不会低  
  Top

10 楼bluewindyy(班班)回复于 2006-03-12 14:23:39 得分 0

虚拟列表就是用在这种情况Top

11 楼striking(庸人自扰)回复于 2006-03-13 09:04:37 得分 0

http://www.codeproject.com/listctrl/virtuallist.aspTop

12 楼lzd(活着便精彩)回复于 2006-03-13 10:48:10 得分 0

不用重新遍历数据库吧..删除了数据库的记录后..把对应在listctrl中对应的记录也删除掉就好了..Top

13 楼wawaku(一堆裤衩!)回复于 2006-03-13 11:19:27 得分 0

硬撑者正解  
   
  就是使得内存中对数据的改变与数据库同步,但只读取内存中的数据来显示会比读取数据库中的数据快很多  
  Top

相关问题

  • 在DataList里删除一条记录后,当前界面的数据没有刷新,而后台数据库已删除,需按“刷新”按纽后数据才刷新出来,这是为什么?
  • 怎么刷新,删除?
  • 界面刷新的问题
  • 界面的刷新问题
  • wince下的界面刷新
  • 界面刷新的问题
  • 页面上的删除与刷新
  • Acess删除后为何无刷新;
  • 如何删除后刷新页面
  • 如何刷新程序界面

关键词

  • 界面
  • 数据库
  • 数据
  • 虚拟
  • 用户
  • 记录
  • listctrl
  • 删除
  • 遍历
  • 刷新

得分解答快速导航

  • 帖主:Pandona
  • striking

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo