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.
procedure TForm1.cxGridDBTableView1VENDOR_IDPropertiesCloseUp(Sender: TObject);
begin
(Sender as TcxExtLookupComboBox).Properties.View.DataController.Filter.Clear;
end;
如果不要cxGrid,而用TcxDBExtLookupComboBox控制元件,方法與上述雷同!