删除记录后,如何高效地刷新界面?
我做一个类似电子表格的程序,以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




