红鱼儿

kbmMWSmartBind实现ListView绑定数据集进阶篇(一)

前面有写过如何使用kbmMW SmartBind,绑定数据集与ListView,来自动显示数据集的内容。

下面先复习一下绑定的代码:

procedure TForm1.bind;
begin
  if not Assigned(FBindings) then
    FBindings:=TkbmMWBindings.Create();

  FBindings.Clear;
  FBindings.Bind(mt,'f1',ListView1,'#Text1');
  FBindings.Bind(mt,'f2',ListView1,'#Text2');
  FBindings.Bind(mt,'f3',ListView1,'#Text5');
  FBinding:= FBindings.Bind(mt,'@',ListView1,'@',[mwboTwoWay]);//双向绑定,位置同步,同时返回FBinding,可以用来导航、操作增、删除、改.

end;

 

mt是数据集,有三个字段,f1,f2,f3。

ListView放置了三个文本对象,Text1,Text2,Text3及一个图片对象Image4。

调用bind方法,将mt与ListView1绑定(f1绑定Text1,f2绑定Text2),ListView1就自动显示了f1,f2字段的内容,这看起来似乎非常完美,其实不然,在实际的项目中,有需要我们进一步定制ListViewItem的显示内容需求,比如:根据字段f1的值,来确定对象Image4显示的图片,这需求又该如何实现?

解决这个问题的方法,就是利用ListView的OnUpdateObjects事件。下面是这个事件的处理代码:

procedure TForm1.ListView1UpdateObjects(const Sender: TObject;
  const AItem: TListViewItem);
var
  li:TListItemImage;
  lt1,lt2,lt3:TListItemText;
begin
  lt1:= TListItemText(AItem.Objects.FindDrawable('Text1'));
  lt2:= TListItemText(AItem.Objects.FindDrawable('Text2'));
  lt3:= TListItemText(AItem.Objects.FindDrawable('Text3'));
  if (lt1<>nil) and ((lt1.Text.ToInteger mod 5)=0) then
  begin
     lt3.Text:='被5整除.............................................';
     //AItem.Data['Text2']:='被5整除';

    li:= TListItemImage(AItem.Objects.FindDrawable('Image4'));
    if li<>nil then
       li.Bitmap:=ImageList1.Source[1].MultiResBitmap[0].Bitmap;
    AItem.Height:=88;
    lt2.Height:=88;
  end
  else
  begin
    lt3.Text:='不能被5整除';

    li:= TListItemImage(AItem.Objects.FindDrawable('Image4'));
    if li<>nil then
       li.Bitmap:=ImageList1.Source[0].MultiResBitmap[0].Bitmap;

  end;
  
end;

在这个事件中,我们可以通过AItem.Objects.FindDrawable来找到文本对象、图片对象,并根据其值,来进一步定制这些对象的显示。

下面是运行结果:

ListView还有另外一个事件OnUpdatingObjects,这个事件与OnUpdateObjects有什么区别呢?

经过测试,原来,OnUpdateingObjects可以理解为BeforeUpdateObjects,而OnUpdateObjects为AfterUpdateObjects。在OnUpdatingObjects事件中,AItem中的显示对象,如Text1,还没有被建立,在OnUpdateObjects事件中,显示对象才被建立起来。经过kbmMWSmartBind绑定后:

1.在OnUpdatingObjects事件中,通过AItem.Data['Text1']就可以取到字段值。也可以设置AItem.Data['Text1'],会显示到Text1对象中,但不会更新到字段中;

2.在OnUpdateObjects事件中,同样通过AItem.Data['Text1']就可以取到字段值,也可以设置AItem.Data['Text1'],不会显示到Text1对象中,也不会更新到字段中。注意:数据集当前记录位置与ListView不同步,如果需要使用非绑定的字段,这里需要手工定位数据集,这让人不爽,暂时还不知有更好的办法。

本文基于kbmMW 5.10.20及Delphi 10.3.3版本测试通过。

posted on 2020-03-27 10:59  红鱼儿  阅读(564)  评论(0编辑  收藏  举报