zoukankan      html  css  js  c++  java
  • 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版本测试通过。

  • 相关阅读:
    新学期随笔——脚踏实地
    买书方案
    课程总结和建议
    梦断代码阅读笔记03
    梦断代码阅读笔记02
    构建之法阅读笔记06
    【洛谷5284】[十二省联考2019] 字符串问题(后缀树优化建边)
    【BZOJ3514】Codechef MARCH14 GERALD07加强版(LCT_主席树)
    【BZOJ1487】[HNOI2009]无归岛(仙人掌 DP)
    【洛谷3239_BZOJ4008】[HNOI2015] 亚瑟王(期望 DP)
  • 原文地址:https://www.cnblogs.com/kinglandsoft/p/12579939.html
Copyright © 2011-2022 走看看