本方案不需要修改控件源码,是完美解决cxgrid或TcxDBExtLookupComboBox支持多列模糊匹配快速输入的最佳方案!!
小哥摸索多日,终于搞定cxgrid和TcxDBExtLookupComboBox可以支持多列模糊查找输入了!
本人吐血奉献不需要修改控件源码的方案,堪称史上最完美解决方案!!走过路过不要错过,欢迎收藏!
修改方案: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控件,方法与上述雷同!