Delphi TEdit用Access过滤Tstringgrid

时间:2015-11-14 12:01:02

标签: delphi ms-access filter firemonkey

我使用Delphi 10和Firemonkey,我对它有点新意。我有一个TStringGrid,我将LiveBindings绑定到访问数据库。我需要的是当我按下一个按钮或任何键进入时,使用TEdit的文本过滤此表或TStringGrid,并在结果中显示相同的TstringGrid。就像自定义搜索/过滤框一样。

我还没有任何此类代码。但我认为这就像一个查询。
procedure TForm3.Edit2Typing(Sender: TObject); begin adoquery1.Close; adoquery1.SQL.Text:='select * from instrutor where nome like " %' + edit2.text + '%"'; adoquery1.Open; end;
我试过这个但是因为我已经有了adotable和stringgrid的实时绑定,所以我不应该按照我的方式链接这个Tedit

1 个答案:

答案 0 :(得分:2)

以下示例是使用TAdoQuery和TStringGrid之间的实时绑定的最小应用程序。我为方便起见而做了一个VCL应用程序,而不是FMX应用程序,但这对于如何对a进行过滤没有任何影响。 有条不紊的AdoQuery。

它使用2个TEdits指定要匹配的过滤器值和字段的名称 过滤(在实践中,最好做一些事情,比如使用可用的字段名称填充列表框)。

主要"工作"在UpdateFilter程序中完成。

它使用实时绑定这一事实对如何将过滤器应用于数据集没有任何影响。但是,与StringGrid的实时绑定明显慢于传统(VCL)TDBGrid。要避免的一件重要事情是数据集具有大量字段并且每个字段都有一个stringgrid列的情况,因为它可以使应用程序响应过滤条件中的更改非常慢。减轻这种影响的一种方法是通过将stringgrid的ColCount设置为适当的低值,将stringgrid列的数量限制为更低的数字。另一种方法是为数据集定义持久字段,但只创建其中的一些。

在下面的代码中,我使用了TEdits的OnChange事件来更新FilterFieldName和FilterValue字段,但显然你可以有一个单独的按钮来点击来调用UpdateFilter过程。

代码:

TForm1 = class(TForm)
  ADOConnection1: TADOConnection;
  ADOQuery1: TADOQuery;
  StringGrid1: TStringGrid;
  BindingsList1: TBindingsList;
  DataSource1: TDataSource;
  LinkGridToDataSource1: TLinkGridToDataSource;
  BindSourceDB1: TBindSourceDB;
  edFilterFieldName: TEdit;
  edFilterValue: TEdit;
  procedure FormCreate(Sender: TObject);
  procedure edFilterFieldNameChange(Sender: TObject);
  procedure edFilterValueChange(Sender: TObject);
private
  FFilterFieldName : String;
  FFilterValue : String;
  procedure SetFilterFieldName(const Value: String);
  procedure SetFilterValue(const Value: String);
  procedure UpdateFilter;
public
  property FilterFieldName : String read FFilterFieldName write SetFilterFieldName;
  property FilterValue : String read FFilterValue write SetFilterValue;
end;

[...]

procedure TForm1.FormCreate(Sender: TObject);
begin
  FilterFieldName := edFilterFieldName.Text;
  FilterValue := edFilterValue.Text;
end;

procedure TForm1.edFilterFieldNameChange(Sender: TObject);
begin
  FilterFieldName := edFilterFieldName.Text;
end;

procedure TForm1.edFilterValueChange(Sender: TObject);
begin
  FilterValue := edFilterValue.Text;
end;

procedure TForm1.SetFilterFieldName(const Value: String);
begin
  if FilterFieldName <> Value then begin
    FFilterFieldName := Value;
    UpdateFilter;
  end;
end;

procedure TForm1.SetFilterValue(const Value: String);
begin
  if FilterValue <> Value then begin
    FFilterValue := Value;
    UpdateFilter;
  end;
end;

procedure TForm1.UpdateFilter;
var
  Expr : String;
begin
  AdoQuery1.Filtered := False;

  //  The next statement checks whether the FilterFieldName
  //  matches a field in the dataset and exits if not.  Since the
  //  FilterFieldName value comes from an edit box, it will be incomplete while the user is typing it in
  if AdoQuery1.FieldByName(FilterFieldName) = Nil then
    exit;
  if FilterValue <> '' then begin
    Expr := FilterFieldName + ' like ' + QuotedStr('%' + FilterValue + '%');
    AdoQuery1.Filter := Expr;
    AdoQuery1.Filtered := True;
  end;
end;