簡體   English   中英

添加搜索以搜索DBGrid中的數據並臨時更改DBGrid顯示的內容-Delphi

[英]Adding a search that searches data in a DBGrid and temporarily changes what that DBGrid displays- Delphi

好的,我正在使用顯示數據庫中數據的DBGrid。

該數據庫包含一個表,該表包含11列。 第4列稱為客戶名稱,其中包含客戶名稱。

我想要一個搜索框(類似於google搜索欄),在其中輸入我想要的客戶名稱。一旦這樣做,DBGrid應該更改並僅在第四列中顯示包含該客戶名稱的行(客戶名稱列) )

例:

Column names: 

column1 - column2 - column3 - customer name - column5 - column6 - column7 - column8 - column9 - column10 - column11
blabla    blabla    blabla    John Edwards    blabla    blabla    blabla    blabla    blabla    blabla     blabla
blabla1   blabla1   blabla1   Michael Skunk   blabla    blabla    blabla    blabla    blabla    blabla     blabla
blabla2   blabla2   blabla2   John Edwards    blabla2   blabla2   blabla2   blabla2   blabla2   blabla2    blabla2

依此類推..很多行,每一列都有不同的信息。 在某些時候,我在數據庫的其余各列中將具有不同的信息,但在第4列(客戶名稱列)中將具有相同的客戶端名稱

在我的示例中,我已經這樣做了,如您所見,我有2個John Edwards條目

隨后,當我在搜索字段中輸入該客戶名稱時,我希望所有這些行都顯示在DBGrid上,而其他任何在第4列中不包含該名稱的行都將消失

如果使用上面的示例,一旦我在搜索字段中寫了John Edwards,我應該只在DBGrid上看到那兩行

一旦清除了我寫的內容的搜索字段,DBGrid應該恢復到其初始狀態並顯示所有內容,就像在搜索之前一樣。

任何想法如何做到這一點? 由於我不熟悉Delphi,並且在這里和Google上進行搜索,因此我一無所知。我沒有提出任何有用的信息/我可以使用的任何信息。

我將不勝感激,非常感謝!

如果要處理SQL SELECT返回的少量行,則可以使用TDataSet.FilterTDataSet.Filtered 您可以從任何地方獲取輸入,例如普通的TEdit

由於您沒有發布任何詳細信息(例如您正在使用的數據庫控件,Delphi的版本,提供變量名稱的任何代碼或其他任何內容),因此,這是一個非常有用的示例。 我稱該查詢附加在DBGrid Qry ,因為不知道根據您發布的內容還要調用什么。 FilterRecordsButtonClearFilterButtonSearchEdit ,而SearchEditTEdit 隨意使用您想要切換過濾器或從用戶那里獲取輸入的任何控件。

procedure TForm1.FilterRecordsButtonClick(Sender: TObject);
begin
  if SearchEdit.Text <> '' then
  begin
    {
     The brackets around the column name are required because you've got 
     spaces in the name; they're also needed if your column name is a 
     reserved word. QuotedStr puts the necessary quote characters around
     the value.
    }
    Qry.Filter := '[Customer Name] = ' + QuotedStr(SearchEdit.Text);
    Qry.Filtered := True;
    Qry.First;
    FilterRecordsButton.Enabled := False;
    ClearFilterButton.Enabled := True;
  end;
end;

procedure TForm1.ClearFilterButtonClick(Sender: TObject);
begin
  Qry.Filtered := False;
  Qry.Filter := '';
  Qry.First;
  ClearFilterButton.Enabled := False;
  FilterRecordsButton.Enabled := True;
end;

如果要處理大量的行(例如, SELECT * FROM MyTable而沒有返回幾十萬行的WHERE ),那么“已Filtered的性能可能是不可接受的。 在這種情況下,最好將適當的WHERE子句添加到SELECT然后重新打開查詢以僅顯示相關行。 當然,在沒有WHERE情況下,您絕不應該執行SELECT ,因此您不需要這樣做。 :-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM