zoukankan      html  css  js  c++  java
  • DevExpress控件cxGrid实现多列模糊匹配输入的完美解决方案

    本方案不需要修改控件源码,是完美解决cxgrid或TcxDBExtLookupComboBox支持多列模糊匹配快速输入的最佳方案!!

    小哥摸索多日,终于搞定cxgrid和TcxDBExtLookupComboBox可以支持多列模糊查找输入了!

    纵观网上的方案,不是修改控件源码,就是自己封装弹窗,代码太长太复杂,后遗症也多多,而自己封装用户体验也是难以尽善尽美,因为UI风格皮肤都不一致啊,嗷嗷~~
    本人吐血奉献不需要修改控件源码的方案,堪称史上最完美解决方案!!走过路过不要错过,欢迎收藏!
     

    修改方案:cxGrid列的Properties设置为ExtLookupComboBox对象,或者用TcxDBExtLookupComboBox控件。

    TExtLookupComboBox和TcxDBExtLookupComboBox控件默认只支持单列查找,而且是始于包含查找,不是我们想要的多列完全模糊匹配查找,所以还需要自行修改。改写方法如下:

    假设cxgrid中有一个服务商ID数据列:cxGridDBTableView1VENDOR_ID: TcxGridDBColumn,绑定服务商ID字段。

    第1步: OnGetPropertiesForEdit Event.

    procedure TForm1.cxGridDBTableView1VENDOR_IDGetPropertiesForEdit

      (Sender: TcxCustomGridTableItem; ARecord: TcxCustomGridRecord;

      var AProperties: TcxCustomEditProperties);

    begin

      with (AProperties as TcxExtLookupComboBoxProperties) do

      begin

        //也可以在设计期的属性窗口中设置,则可以省去此第1步代码。

        CaseInsensitive := True;

        CaseSensitiveSearch := False;

        IncrementalSearch := False;

        IncrementalFiltering := False;
        DropDownListStyle := lsEditList; 

        View.DataController.Filter.Options := [fcoCaseInsensitive]; //过滤忽略大小写差异.

        View.DataController.Filter.AutoDataSetFilter := False; //避免编辑时干扰到其它行. 

        View.FilterBox.CustomizeDialog := False;

      end;

    end;
     第2步:Properties.OnChange  Event.

    procedure TForm1.cxGridDBTableView1VENDOR_IDPropertiesChange(Sender: TObject);

    var

      iCol: Integer;

    begin
      with (Sender as TcxExtLookupComboBox) do

      begin

        Properties.View.DataController.Filter.Clear;

        Properties.View.DataController.Filter.Root.Clear;

        // View中所有可视列都用于模糊检索.

        for iCol := 0 to Properties.View.ItemCount - 1 do

        begin

          if (Properties.View.Items[iCol] as TcxGridColumn).VisibleForCustomization

          then

          begin

            if Properties.View.DataController.Filter.Root.Count > 0 then

              Properties.View.DataController.Filter.Root.BoolOperatorKind := fboOR;

            Properties.View.DataController.Filter.Root.AddItem
             (Properties.View.Items[iCol], foLike, '%' + EditText + '%',  '%' +EditText + '%');

          end;

        end;

        Properties.View.DataController.Filter.Active := True;

        if Properties.View.DataController.DataRowCount = 1 then

          Properties.View.DataController.SetFocus;

      end;

    end;
     第3步:Properties.OnCloseUp  Event.

    Properties.OnCloseUp事件代码:
    procedure TForm1.cxGridDBTableView1VENDOR_IDPropertiesCloseUp(Sender: TObject);
    begin
      (Sender as TcxExtLookupComboBox).Properties.View.DataController.Filter.Clear;

    end;

    如果不要cxGrid,而用TcxDBExtLookupComboBox控件,方法与上述雷同!
     

  • 相关阅读:
    CSRF攻击与防御
    別惹我
    单系统登录机制SSO
    jdk8- list操作
    mybatis--Mapper 常见报错总结(持续总结)
    死锁排查的小窍门 --使用jdk自带管理工具jstack
    oracle笔记--查询10条之后记录的数据
    zookeeper集群操作【这里只说明简单的操作步骤,zk的相关参数、说明请参考官方文档】
    利用jquery操作隐藏table某一列
    关于python3.X 报"import urllib.request ImportError: No module named request"错误,解决办法
  • 原文地址:https://www.cnblogs.com/westsoft/p/8503890.html
Copyright © 2011-2022 走看看