2015-11-14 99 views
0

我使用Delphi 10與Firemonkey,我有點新。我有一個TStringGrid,我用LiveBindings綁定到一個訪問數據庫。我需要的是當我按下按鈕或任何鍵被輸入時,用TEdit的文本過濾這個表或TStringGrid,並在同一個TstringGrid中的結果中顯示它。就像自定義搜索/過濾器框一樣。德爾福TEdit過濾Tstringgrid與Access

我還沒有任何代碼。但我認爲這將像是一個查詢。
procedure TForm3.Edit2Typing(Sender: TObject); begin adoquery1.Close; adoquery1.SQL.Text:='select * from instrutor where nome like " %' + edit2.text + '%"'; adoquery1.Open; end;
我已經試過這一點,但因爲我已經有與adotable和stringgrid一個livebinding,我不,我應該

+0

請添加你嘗試到Q的代碼。還是你說你不知道從哪裏開始? – MartynA

+0

與q查詢一樣,當然。但是,在Delphi數據集上下文中,「過濾器」這個表達方式通常意味着只對從數據庫中檢索到的記錄的子集進行操作(例如顯示)到Delphi應用程序中。所以你需要決定你是否想要查詢或過濾器並說。 – MartynA

+0

好的,我應該使用AdoTable.Filter屬性。現在我只需要將它與stringgrid綁定? –

回答

2

下面的例子是使用活的結合最小的應用程序鏈接此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; 
+0

好吧,我用你的例子,並在AdoQuery中使用過濾器屬性,這工作正常。我只是不得不將'Like'更改爲'=',因爲我使用訪問,顯然它不接受'喜歡'。我必須輸入完整的名稱才能顯示。我輸入部分名稱時如何顯示?像'te'而不是'測試'或類似的東西。這是一句話:'adoquery1.Filter:=('Name ='+ QuotedStr(Edit2.Text));'。 –

+0

實際上,我只是使用AdoConnection字符串中的Microsoft.Jet.OLEDB.4.0驅動程序對MS Access數據庫進行了測試,並且它工作正常,包括對定義爲Char(40)的列使用'like'。您使用的是什麼Access驅動程序? – MartynA

+0

我正在使用相同的。我試着輸入像你的和其他類似的過濾器語法,但都沒有工作。對我而言,用這種方式工作很好,但讓它更「動態」會更方便用戶。我會將你的答覆標記爲答案,但如果你能幫我找到答案,我將不勝感激。 :) –