下面的例子是使用活的結合最小的應用程序鏈接此TEDIT方式在TAdoQuery和TStringGrid之間。我已經做了一個VCL應用程序的方便,而不是FMX,但是這對於如何在實時綁定的AdoQuery上進行過濾沒有任何影響。
它使用2個TEdits來指定要匹配的過濾器值以及要過濾的字段的名稱 (實際上,最好是使用可用字段名填充列表框)。
主要「工作」在UpdateFilter
程序中完成。
它使用實時綁定的事實對於如何將過濾器應用於數據集沒有任何影響。然而,活動綁定到一個StringGrid要比傳統的(VCL)TDBGrid慢得多。要避免的一個重要的事情是數據集中包含大量字段並且每個字段有一個stringgrid列的情況,因爲它可以使應用程序非常緩慢地響應篩選條件中的更改。通過將字符串網格的ColCount設置爲適當的低值,一種減輕這種影響的方法就是將字符串網格列的數量限制爲更低的數字。另一種方法是爲數據集定義持久性字段,但只能創建其中的幾個字段。
在下面的代碼中,我使用了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;
請添加你嘗試到Q的代碼。還是你說你不知道從哪裏開始? – MartynA
與q查詢一樣,當然。但是,在Delphi數據集上下文中,「過濾器」這個表達方式通常意味着只對從數據庫中檢索到的記錄的子集進行操作(例如顯示)到Delphi應用程序中。所以你需要決定你是否想要查詢或過濾器並說。 – MartynA
好的,我應該使用AdoTable.Filter屬性。現在我只需要將它與stringgrid綁定? –