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的绑定及同步显示的更多相关文章

  1. [Android Pro] android控件ListView顶部或者底部也显示分割线

    reference to  :  http://blog.csdn.net/lovexieyuan520/article/details/50846569 在默认的Android控件ListView在 ...

  2. Android ListView滑动过程中图片显示重复错乱闪烁问题解决

    最新内容建议直接访问原文:Android ListView滑动过程中图片显示重复错乱闪烁问题解决 主要分析Android ListView滚动过程中图片显示重复.错乱.闪烁的原因及解决方法,顺带提及L ...

  3. C# dev GridControl绑定数据不能显示

    如题, dev GridControl绑定数据不能显示时可检查数据操作顺序 view = advBandedGridView1 as AdvBandedGridView; //第1 this.advB ...

  4. 【转】 C# ListView实例:文件图标显示

    [转] C# ListView实例:文件图标显示 说明:本例将目录中的文件显示在窗体的ListView控件中,并定义了多种视图浏览.通过调用Win32库函数实现图标数据的提取. 主程序: 大图标: 列 ...

  5. 真正的原生JS数据双向绑定(实时同步)

    真正的原生JS数据双向绑定(实时同步) 接触过vue之后我感觉数据双向绑定实在是太好用了,然后就想着到底是什么原理,今天在简书上看到了一位老师的文章 js实现数据双向绑定 然后写出了我自己的代码 wi ...

  6. 【技巧】DataGridView,ListView重新绑定时保持上次滚动位置

    (1)DataGridView 今天在项目时遇到一个问题,将DataTable绑定到DataGridView,其中一列为CheckBox列,当我修改该列值时,触发CellValueChanged事件. ...

  7. WPF DataGrid、ListView 简单绑定

    DataGrid运行效果: xaml 代码: DataGridName= dtgData ItemsSource= {Binding} AutoGenerateColumns= False DataG ...

  8. WPF之让ListView中的CheckBox居中显示

    第一步:在资源中定义一个居中的样式: <Window.Resources> <Style x:Key="ListViewItemStyle" TargetType ...

  9. 在ListView的GroupItem头中显示每列的Summary

    问题描述 WPF自带的ListView和DataGrid控,都提供了数据分组的支持,并可以对分组的Header进行自定义.但是,如果想在每个分组的Header中,显示出本分组的"小计&quo ...

随机推荐

  1. SringCloud学习成长之路 八 消息总线

    Spring Cloud Bus 将分布式的节点用轻量的消息代理连接起来.它可以用于广播配置文件的更改或者服务之间的通讯,也可以用于监控.本文要讲述的是用Spring Cloud Bus实现通知微服务 ...

  2. thymeleaf中switch case多出一个空行

    以下是<thymeleaf3.0.5中文参考手册.pdf>中的代码,官方代码没有具体去查询. <div th:switch="${user.role}"> ...

  3. LeetCode_38. Count and Say

    38. Count and Say Easy The count-and-say sequence is the sequence of integers with the first five te ...

  4. laravel php门面模式

    门面模式   理解3个概念: 1)Container的概念,laravel所有的服务都注册在container里面,至于如何注册,就是使用service provider   2)service pr ...

  5. droid AVD创建及设置中各参数详解

    设置AVD时有些参数比较模糊,特地找了篇文章,大家参考下! 本文根据如下的模拟器安装做一些解释: Name: 自定义虚拟的名称,不能有空格或者其他非法字符,否则不能创建,即Creat AVD不能高亮点 ...

  6. sqlserver如何创建链接服务器

    遇到下列问题: 线上服务器A,中转服务器B,本地服务器C 数据在A上面,想在B上面操作类似 select * from [A].[database].table这样的SQL,不用去链接服务器,直接把处 ...

  7. Ubuntu-18.04更改安装源为国内源

    环境查看 修改源文件 /etc/apt/sources.list 备份配置文件后把文件内容替换如下 deb http://mirrors.aliyun.com/ubuntu/ bionic main ...

  8. 最新 多益网络java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿. 多益网络等10家互联网公司的校招Offer,因为某些自身原因最终选择了 多益网络.6.7月主要是做系统复习.项目复盘.Le ...

  9. canvas画箭头demo

    效果图: 代码: <!DOCTYPE html> <html> <title>canvas画箭头demo</title> <body> &l ...

  10. csu 1756: Prime

    1756: Prime Submit Page   Summary   Time Limit: 3 Sec     Memory Limit: 128 Mb     Submitted: 281    ...