红鱼儿

kbmMWSmartBind实现ListView绑定数据集进阶篇(三)

基于kbmMW SmartBind,在实际项目的应用过程中,遇到了显示效率太低的问题,用户在项目沟通会上反馈这一问题,让咱这开发者都感觉尴尬了。具体的实现过程,参考kbmMWSmartBind实现ListView绑定数据集进阶篇(二)。

为什么造成这样的问题呢?

经过反复测试代码,问题出在重复绑定上,Listview与ClientQuery绑定,当利用ClientQuery做数据查询,就会遇到反复打开数据集,这时候,我们要重新绑定,即:在打开数据集前,要解除绑定,打开后再重新绑定。

有什么办法来解决不重复绑定吗?答案是有的。

为了解决这一问题,就要解决,重新打开数据集时,不重建字段,ClientQuery为我们提供了一个属性:AutoFieldDefsOnOpen,关于这个属性的用法,在很早的文章中我有介绍过,这里再简要说明下:

 

Always:每次打开数据集都重新取字段定义,这是默认值

Never:从不取字段定义,这种情况,需要我们在设计期为ClientQuery建好字段

Once:只取一次字段定义,即第一次打开数据集时才取。

WithData:

好了,现在我们将AutoFieldDefsOnOpen设置为mwafoOnce,让数据集只取一次字段定义,避免重复打开数据集时重建字段,进而避免每次都重复执行绑定。最终,我们用下面的方式实现绑定:

FBind.UpdateEvent.Activate(False);
ClientQuery.AutoFieldDefsOnOpen:=mwafoNever; ClientQuery.Query.Text:=Select * from test'; ClientQuery.Open; FBind.Bind(...)
FBind.UpdateEvent.Activate(True); ...

经过这样改进,Listview显示的速度就从蜗牛变成飞机了!

2020-05-18:补充,用户点击快了,会出错,然后界面显示不正常,只能退出重进app,修正办法就是在打开数据集前,停止Bind,即FBind.UpdateEvent.Activate(False),打开后再重新打开FBind,即FBind.UpdateEvent.Activate(True);

另外,设置为mwafoOnce时,重新打开数据集时,会产生错误,目前用mwafoNever正常,但需要在设计期定义好定段。

总结来说,作者对于绑定数据集情况,没有考虑数据集的反复重新打开的场景,把此问题已经反馈给作者,期待下一版本有改正。

 

posted on 2020-05-15 10:13  红鱼儿  阅读(477)  评论(0编辑  收藏  举报