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正常,但需要在设计期定义好定段。
总结来说,作者对于绑定数据集情况,没有考虑数据集的反复重新打开的场景,把此问题已经反馈给作者,期待下一版本有改正。