Фильтр в cxLookupCombobox
2 варианта
Как сделать фильтрацию в TcxLookupCombobox?
Кроме стандартных для cxLookupCombobox свойств (ListSource, KeyFieldNames, ListFieldNames), нужно установить следующие значения:
Далее выполняем разделение строки на слова
Второй вариант
А ещё можно сделать связку cxGridViewRepository (TcxGridDBTableView) + TcxExtLookupCombobox и получить в выпадающем списке полноценную сетку - cxGridDBTableView
Как сделать фильтрацию в TcxLookupCombobox?
Кроме стандартных для cxLookupCombobox свойств (ListSource, KeyFieldNames, ListFieldNames), нужно установить следующие значения:
<cxLookupCombobox>.Properties.DropDownListStyle := lsEditList; <cxLookupCombobox>.Properties.IncrementalFiltering := false;
Далее выполняем разделение строки на слова
// Разбивка строки по словам procedure SplitDelimitedString(AStrings: TStrings; AText, ADelimiter: string); var p, n: integer; Text: PChar; begin Text := PChar(AText); AStrings.Clear; n := Length(ADelimiter); while Assigned(Text) do begin p := Pos(ADelimiter, Text) - 1; if p < 0 then Break; AStrings.Add(Copy(Text, 1, p)); Inc(Text, p + n); end; if Assigned(Text) and (Length(Text) > 0) then AStrings.Add(Text); end;
// Установка фильтра для полей lookup-а, с разбивкой по словам и полям procedure ApplySearchFilter(Controller: TcxDBDataController; Fields: string; Text: string); var i, j: integer; ItemLink: TObject; Filter: TcxDataFilterCriteria; FL: TcxFilterCriteriaItemList; FieldList, TextWords: TStrings; begin TextWords := TStringList.Create; FieldList := TStringList.Create; try Filter := Controller.Filter; Filter.BeginUpdate; try Filter.Active := false; Filter.Clear; Filter.Options := Filter.Options + [fcoCaseInsensitive]; Filter.Root.BoolOperatorKind := fboOr; SplitDelimitedString(FieldList, Fields, ';'); SplitDelimitedString(TextWords, Text, ' '); for i := 0 to FieldList.Count - 1 do if FieldList[i] <> '' then begin FL := Filter.Root.AddItemList(fboAnd); ItemLink := Controller.GetItemByFieldName(FieldList[i]); if Assigned(ItemLink) then for j := 0 to TextWords.Count - 1 do if TextWords[j] <> '' then FL.AddItem(ItemLink, foLike, '%' + TextWords[j] + '%', TextWords[j]); end; Filter.Active := true; finally Filter.EndUpdate; end; finally TextWords.Free; FieldList.Free; end; end;
// вызов procedure TForm1.cxDBLookupComboBox1PropertiesChange(Sender: TObject); var S: TcxDBLookupComboBox; begin S := TcxDBLookupComboBox(Sender); ApplySearchFilter(S.Properties.DataController, S.Properties.ListFieldNames, S.Text); // для тестирования Label1.Caption := S.Properties.DataController.Filter.FilterText; end;
Второй вариант
А ещё можно сделать связку cxGridViewRepository (TcxGridDBTableView) + TcxExtLookupCombobox и получить в выпадающем списке полноценную сетку - cxGridDBTableView