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. 迭代器iterator-生成器generator

    1. 迭代 根据记录的前面的元素的位置信息 去访问后续的元素的过程 -遍历 迭代 2. 可迭代对象 iterable 如何判断可迭代对象的3种方式 能够被迭代访问的对象 for in 常用可迭代对象- ...

  2. cookie和session-csrf防护-中间件

    cookie概念: 是由服务器生成,保存在浏览器端的一小段文本信息. cookie特点: 1) cookie是以键值对进行存储的. 2) 浏览器访问网站时,会将本地保存的跟网站相关的所有cookie发 ...

  3. Linux (Ubuntu)安装ssh

    看ssh服务是否启动 打开"终端窗口",输入sudo ps -e |grep ssh 回车有sshd,说明ssh服务已经启动, 如果没有启动,输入sudo service ssh ...

  4. Node.js使用ftp连接远程ftp服务器枚举和下载文件示例

    示例代码: var Ftp = require('ftp'); var fs = require('fs'); var path = require('path'); // 首先判断参数中是否包含{d ...

  5. 【Leetcode_easy】796. Rotate String

    problem 796. Rotate String solution1: class Solution { public: bool rotateString(string A, string B) ...

  6. 【Leetcode_easy】706. Design HashMap

    problem 706. Design HashMap solution1: class MyHashMap { public: /** Initialize your data structure ...

  7. JsonSchema用法

    JsonSchema用法 简介 JSON Schema是基于JSON格式,用于定义JSON数据结构以及校验JSON数据内容.JSON Schema官网地址:http://json-schema.org ...

  8. 中检测到有潜在危险的 Request.Form 值

    经常会出现从客户端(xxx)中检测到有潜在危险的 Request.Form 值. 这个问题我们只用在web.config中添加一句代码即可 <system.web> <pages v ...

  9. python爬虫的入门问题

    第一张图是代码,爬的是亚马逊的一个商品网页,能爬出来内容,但是内容之间有很多空白换行,这是什么原因?要怎么解决?

  10. [转帖]CentOS 8 都发布了,你还不会用 nftables?

    CentOS 8 都发布了,你还不会用 nftables? https://www.cnblogs.com/ryanyangcs/p/11611730.html 改天学习一下 原文链接:CentOS ...