SmartBinding实现DataSet与ListView的绑定及同步显示
kbmMW 5.10.20发布了,这个版本解决了我提出的问题,当对DataSet增删记录时,ListView能够同步显示。下面看看具体的实现代码。
为了解决上面的问题,作者为IkbmMWBindingNavigator接口增加了下面的方法:
IkbmMWBindingNavigator = interface
......
function Delete:boolean;
function Insert:boolean; overload;
function Insert(const ANames:array of string; const AValues:array of TValue):boolean; overload;
function Append:boolean; overload;
function Append(const ANames:array of string; const AValues:array of TValue):boolean; overload; procedure Refresh; property Value[const AName:string]:TValue read GetValue write SetValue;
end;
通过上面的方法,即可实现对数据集的增加、删除等操作。
接下来看一下具体的实现过程:
第一步,绑定DataSet与ListView并取得返回的接口IkbmMWBinding。通过IkbmMWBinding接口的属性Navigator,可以访问IkbmMWBindingNavigator接口,从而调用上面新增的方法。
procedure TForm1.Button9Click(Sender: TObject);
begin bnd:=nil;
Binding.Clear;
//ListView1.Items.Clear; dataset:=mt;
dataset.disableControls;//kbmMW 5.10.10必须调用,kbmMW 5.10.20可以不调用了,这是改进的地方
bnd:=Binding.Bind(dataset,'f1',Edit1,'Text',[mwboTwoWay]);
Binding.Bind(dataset,'f2',Edit2,'Text',[mwboTwoWay]);
Binding.Bind(dataset,'f3',DateEdit1,'Date',[mwboTwoWay]); bnd:= Binding.Bind(dataset,'f1',ListView1,'#Text1');
Binding.Bind(dataset,'f2',ListView1,'#Text2');
Binding.Bind(dataset,'f3',ListView1,'#Text3'); Binding.Bind(dataset,'@',ListView1,'@',[mwboTwoWay]);
dataset.EnableControls;//kbmMW 5.10.10必须调用,kbmMW 5.10.20可以不调用了,这是改进的地方
end;
当执行这段代码后,会出现下面的结果:

ListView正确的显示了数据集的所有记录内容。无论我们是执行dataset.Next还是bnd.Navigator.Next,ListView与dataSet都会同步显示当前记录的位置。
第二步,实现删除
现在我们删除一条记录:
procedure TForm1.Button12Click(Sender: TObject);
begin
// mt.Delete;
// bnd.Navigator.Refresh; bnd.Navigator.Delete; end;
如果直接操作数据集,执行Delete方法,那么,还需要执行bnd.Navigator.Refresh;
如果直接通过bnd执行Delete方法,则不需要执行Refresh方法。
第三步,实现增加
procedure TForm1.Button11Click(Sender: TObject);
begin
// mt.Append;
// mt.FieldByName('f1').Value:='101';
// mt.FieldByName('f2').Value:=101;
// mt.Post;
//
// bnd.Navigator.Refresh; bnd.Navigator.Append;
bnd.Navigator.Value['f1']:='';
bnd.Navigator.Value['f2']:=;
bnd.Navigator.Value['f3']:=Date; end;
上面代码,象删除操作一样,可以通过数据集实现,也可以通过bnd接口实现。当通过数据集实现时,需要调用Refresh方法。
这里有个bug,kbmMW 5.10.10就存在,现在5.10.20还没有修复,下面是我修改的代码:
procedure TkbmMWBindingDatasetNavigator.SetValue(const AName:string; const AValue:TValue);
var
fld:TField;
begin
if IsValid then
begin
fld:=FDataset.FindField(AName);
if fld<>nil then
begin
if not (FDataset.State in [dsEdit,dsInsert]) then//+++++
FDataset.Edit; //+++++ fld.AsVariant:=TkbmMWRTTI.ConvertValue2Variant(AValue,nil);
end;
end;
end;
这是个小问题,就是FDataSet没在编辑状态。
5.10.10,需要这样调用:就是退出当前界面时,要清空bnd接口变量,让Binding能够正确的释放,不然,退出应用时会产生AV错误。
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
bnd:=nil;
Binding.Clear;
end;
kbmMW 5.10.20,SmartBinding绑定TDataSet与TListView,对我来说,是一个质的飞跃!可以实用到项目中了。
当然,在具体使用时,还会遇到一些问题,需要自己来处理,比如,用TDateEdit绑定一个TField,当在TDateEdit中输入日期,会产生错误,

原因就是SmartBinding是即时转换输入值到对应的TField,而这时候,还没有完整的输入一个日期。可以用下面的代码来处理:
procedure TForm1.DateEdit1Enter(Sender: TObject);
begin Binding.EnableByName('DateEdit1',False);//进入这个控件时,暂时屏蔽绑定 end; procedure TForm1.DateEdit1Exit(Sender: TObject);
begin
Binding.EnableByName('DateEdit1',True);//退出时打开绑定
end;
上面只是我暂时想到的办法,也不太尽人意,但总算避免了出错。类似的控件还会有这样的问题,一时间想不出更好的办法。
查看kbmMW 5.10.20的更新日志,对SmartBinding框架,为TkbmMWScheduler增加了Start, Stop 及 Shutdown 方法,为TkbmMWBindings增加了Shutdown方法,通过Binding.Shutdown调用,TkbmMWEvents也增加了Shutdown方法,退出应用时作者建议我们调用以保证程序更好的退出。
SmartBinding实现DataSet与ListView的绑定及同步显示的更多相关文章
- [Android Pro] android控件ListView顶部或者底部也显示分割线
reference to : http://blog.csdn.net/lovexieyuan520/article/details/50846569 在默认的Android控件ListView在 ...
- Android ListView滑动过程中图片显示重复错乱闪烁问题解决
最新内容建议直接访问原文:Android ListView滑动过程中图片显示重复错乱闪烁问题解决 主要分析Android ListView滚动过程中图片显示重复.错乱.闪烁的原因及解决方法,顺带提及L ...
- C# dev GridControl绑定数据不能显示
如题, dev GridControl绑定数据不能显示时可检查数据操作顺序 view = advBandedGridView1 as AdvBandedGridView; //第1 this.advB ...
- 【转】 C# ListView实例:文件图标显示
[转] C# ListView实例:文件图标显示 说明:本例将目录中的文件显示在窗体的ListView控件中,并定义了多种视图浏览.通过调用Win32库函数实现图标数据的提取. 主程序: 大图标: 列 ...
- 真正的原生JS数据双向绑定(实时同步)
真正的原生JS数据双向绑定(实时同步) 接触过vue之后我感觉数据双向绑定实在是太好用了,然后就想着到底是什么原理,今天在简书上看到了一位老师的文章 js实现数据双向绑定 然后写出了我自己的代码 wi ...
- 【技巧】DataGridView,ListView重新绑定时保持上次滚动位置
(1)DataGridView 今天在项目时遇到一个问题,将DataTable绑定到DataGridView,其中一列为CheckBox列,当我修改该列值时,触发CellValueChanged事件. ...
- WPF DataGrid、ListView 简单绑定
DataGrid运行效果: xaml 代码: DataGridName= dtgData ItemsSource= {Binding} AutoGenerateColumns= False DataG ...
- WPF之让ListView中的CheckBox居中显示
第一步:在资源中定义一个居中的样式: <Window.Resources> <Style x:Key="ListViewItemStyle" TargetType ...
- 在ListView的GroupItem头中显示每列的Summary
问题描述 WPF自带的ListView和DataGrid控,都提供了数据分组的支持,并可以对分组的Header进行自定义.但是,如果想在每个分组的Header中,显示出本分组的"小计&quo ...
随机推荐
- json简单案例
1.Group类 import java.util.ArrayList; import java.util.List; class Group{ private int id; private Str ...
- LVS的调度算法介绍
1.轮询调度(rr) 轮询调度(Round Robin 简称'RR')算法就是按依次循环的方式将请求调度到不同的服务器上,该算法最大的特点就是实现简单.轮询算法假设所有的服务器处理请求的能力都一样的, ...
- delphi ADOQUery中错误解决方法"无法为更新定位行。一些值可能已在最后...
使用delphi中的ADOQuery控件中自带的,insert ,edit,delete此操作时,有时会出现下面的错误提示,提示错误信息:"无法为更新定位行.一些值可能已在最后一次读取后已更 ...
- 上交所跨市场ETF申购赎回实时回报
申购赎回实时回报:1.二级市场过户记录(二级市场代码)2.沪市成分股过户记录(全部成分股)3.非沪市资金记录4.沪市资金记录5.ETF一级市场过户记录(一级市场代码)
- 前端表格插件datatables
下载datatables datatables官网:https://www.datatables.net/ datatables下载地址:https://www.datatables.net/down ...
- 在Eclipse Android中设置模拟器屏幕大小
在Eclipse Android中设置模拟器屏幕大小是本文要介绍的内容,主要是来了解并学习Eclipse Android中模拟器的设置,具体关于Eclipse Android内容的详解来看本文. 方法 ...
- Zabbix设置触发器调用远程主机脚本实现触发告警后自动启动自愈功能
参考:https://www.cnblogs.com/xiami-xm/p/8929163.html 当zabbix添加触发器后触发告警后可以设置发送邮件及短信告警,但是恢复故障需要运维人员收到告警以 ...
- 基于MSP430G2231实现的频率计
基于MSP430G2231实现的频率计 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 系列博客说明:此系列博客属于作者在大三大四阶段所储备的关于电子电路设计 ...
- 记:联调安卓设备的神药-无需usb数据线即可直连
前言 最近需要调试公司的安卓服务,正常情况下,我们调试都是减安卓设备通过usb连接在我们座位旁,再不济就是我们扛笔记本到硬件旁边,这样调试屡试不爽,但是有一天你突然发现你带的数据线因为各种原因总是终端 ...
- EF-初识
什么是ORM 起源随着编程的发展,程序里都是面向对象啥的,但是数据库发展呢 网状数据库 ->层次数据库 ->关系数据库(当然还有nosql数据库 我们只是做热数据缓存 后面将会讲到) ...