• 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版本测试通过。

  • 相关阅读:
    Asp.Net多线程用法1
    Asp.Net操作FTP方法
    django 利用PIL 保存图片
    django —— Celery实现异步和定时任务
    豆瓣源安装requirements.txt
    一个有趣的python排序模块:bisect
    Python 多线程
    python list元素为dict时的排序
    python版本坑:md5例子(python2与python3中md5区别)
    单独的 python 脚本文件使用 django 自带的 model
  • 原文地址:https://www.cnblogs.com/kinglandsoft/p/12579939.html
Copyright © 2020-2023  润新知