1. 程式人生 > >DevExpress控制元件cxGrid實現多列模糊匹配輸入的完美解決方案

DevExpress控制元件cxGrid實現多列模糊匹配輸入的完美解決方案

本方案不需要修改控制元件原始碼,是完美解決cxgrid或TcxDBExtLookupComboBox支援多列模糊匹配快速輸入的最佳方案!!

小哥摸索多日,終於搞定cxgrid和TcxDBExtLookupComboBox可以支援多列模糊查詢輸入了!

縱觀網上的方案,不是修改控制元件原始碼,就是自己封裝彈窗,程式碼太長太複雜,後遺症也多多,而自己封裝使用者體驗也是難以盡善盡美,因為UI風格面板都不一致啊,嗷嗷~~
本人
吐血奉獻 不需要修改控制元件原始碼的方案,堪稱史上最完美解決方 案!!走過路過不要錯過,歡迎收藏!  

修改方案:cxGrid列的Properties設定為ExtLookupComboBox物件,或者用TcxDBExtLookupComboBox控制元件。

TExtLookupComboBox和TcxDBExtLookupComboBox控制元件預設只支援單列查詢,而且是始於包含查詢,不是我們想要的多列完全模糊匹配查詢,所以還需要自行修改。改寫方法如下:

假設cxgrid中有一個服務商ID資料列:cxGridDBTableView1VENDOR_ID: TcxGridDBColumn,繫結服務商ID欄位。

第1步: On
GetPropertiesForEdit 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控制元件,方法與上述雷同!