kbmMW 5.10.10发布了,这个版本解决了我提出的问题,当对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; 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]); 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']:='101'; bnd.Navigator.Value['f2']:=101; bnd.Navigator.Value['f3']:=Date; end;
上面代码,象删除操作一样,可以通过数据集实现,也可以通过bnd接口实现。当通过数据集实现时,需要调用Refresh方法。
最后一点经验就是退出当前界面时,要对bnd接口进行处理:
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin bnd:=nil; Binding.Clear; end;