Riyan
Riyan

Reputation: 13

Is possible to set filter option in SMDBGrid to CaseInsensitive?

I have SMDBGrid component with show filter bar option set to true, but filter just working in case-sensitive mode

1.Try with lower case

2.Try with upper case

I have tried to insert the code in SMDBgrid.pas like this

procedure TSMDBGrid.ApplyFilter;
var
  TempCol: Integer;
begin
  if (eoFilterAutoApply in ExOptions) then
  begin
    TempCol := LeftCol;
    BeginUpdate;
    try
      if DataLink.Active then
      begin
        DataLink.DataSet.CheckBrowseMode;
        DataLink.DataSet.Filtered := False;
        DataLink.DataSet.OnFilterRecord := nil;
        DataLink.DataSet.OnFilterRecord := OnFilterRecord;
        DataLink.DataSet.FilterOptions := [foCaseInsensitive]; <-- this the inserted code
        DataLink.DataSet.Filtered := not FilterIsEmpty();//True;
      end;
    finally
      LeftCol := TempCol;
      EndUpdate;
    end;
  end;

  if Assigned(OnFilterChanged) then
    OnFilterChanged(Self);
end;

But no luck, Is posible filter the record ignoring the case?

PS: I use Delphi 2009

Upvotes: 1

Views: 847

Answers (3)

user3824041
user3824041

Reputation: 16

Maybe this is not actual any more, but put in the grid's OnFilterApply event this: Accept:= Pos(UpperCase(FilterString), UpperCase(Field.AsString))>0;

Upvotes: 0

Rafal
Rafal

Reputation: 21

Looks like I cope with this problem too. Trying to find any solution for Delphi XE 10.3 community edition and wrote to author of SMDBGrid and he found workaround.

Please use SQL ADOQuery as follows.

SELECT UPPER(field) FROM your_table

then use event OnAccentStringConvert and uppercase S String as follows:

function TYourFormName.DBGrridNameAccentStringConvert(Sender: TObject; const S: string): string;
begin
  Result := UpperCase(S)
end;

This works very ugly, but at least works. Or you may just create filter by yourself for every table.

Upvotes: 0

Mike Shkolnik
Mike Shkolnik

Reputation: 11

You may use the OnAccentStringConvert event to transform the value for filter in column before compare:

begin
  Result := UpperCase(S)
end;

Upvotes: 1

Related Questions