可以在SMDBGrid中将过滤器选项设置为CaseInsensitive吗?

时间:2018-04-23 11:19:06

标签: delphi-2009

我有SMDBGrid组件,show filter bar选项设置为true,但过滤只是在区分大小写模式下工作

1.尝试使用小写

2.尝试使用大写

我试图像这样在

中插入SMDBgrid.pas中的代码
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;

但是没有运气,是否可以过滤掉忽略此案的记录?

PS: 我使用Delphi 2009

2 个答案:

答案 0 :(得分:0)

在比较之前,您可以使用OnAccentStringConvert事件转换列中过滤器的值:

begin
  Result := UpperCase(S)
end;

答案 1 :(得分:0)

看起来我也可以解决这个问题。试图为Delphi XE 10.3社区版找到任何解决方案,并写信给SMDBGrid的作者,他找到了解决方法。

请按以下方式使用SQL ADOQuery。

SELECT UPPER(field) FROM your_table

然后使用事件OnAccentStringConvert和大写S字符串,如下所示:

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

这很难看,但是至少可以。或者,您可以只为每个表自己创建过滤器。