2016-10-04 29 views
0

好了,所以,我使用的是顯示數據庫中的數據一個DBGrid。並稱,在一個DBGrid搜索數據的搜索和臨時改變什麼DBGrid的信息 - 德爾福

該數據庫包含一個包含11列的表。 列號4被稱爲客戶名稱幷包含客戶的名稱。

我想要一個搜索框(類似於谷歌搜索欄),我會在客戶端名稱中編寫我想要的 一旦我這樣做了,DBGrid應該更改並僅顯示包含第4個客戶端名稱的行列(列客戶名稱)

例子:

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條目約翰愛德華茲

隨後,當我在搜索字段中寫入客戶名稱我希望所有這些行顯示在DBGrid中,而任何其他行不包含該名稱在列號4中消失

如果使用上面的例子,有一次我寫的約翰·愛德華茲在搜索領域,我應該只看到在DBGrid的

的2行

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

任何想法如何做到這一點?我不知道,因爲我是相當新的Delphi和在這裏和在谷歌搜索還沒有拿出任何有用/什麼我可以用..工作

我希望得到任何幫助,非常感謝!

+0

有多少條記錄? –

+0

你的記錄是什麼意思?對不起,沒有母語英語,我也不想混淆你所指的內容,所以請更具體一些,謝謝 – Petzy

+0

表中你想過濾的記錄數量? –

回答

1

如果您正在處理由SQL SELECT返回的少量行,則可以使用TDataSet.FilterTDataSet.Filtered。你可以從任何你想要的地方得到輸入,比如普通的舊版本TEdit

正如你所發佈的任何細節(如DB控制你使用,德爾福,給出變量名,或者別的任何代碼的版本),這裏是一個非常通用的樣品,可以幫助。我打給附加到DBGrid Qry的查詢,因爲根據你發佈的內容,不知道還有什麼可以稱它的。 FilterRecordsButtonClearFilterButton是TButton,而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,所以你不需要那樣做。:-)

+0

在單向數據集上不允許操作。 - 這是我的數據庫責怪對嗎?我應該改變什麼?我在閱讀過濾器文檔前注意到了參考文獻 – Petzy

+0

我正在使用RAD Studio Seattle和dbexpress。使用TSQLQuery,TSimpleDataSet,TDataSource,TSQLConnection。顯然,dbexpress組件是單向的,即使是TSimpleDataSet - 我需要更改該數據庫的DataSet,對吧? – Petzy

+0

TDataSource不是單向的。 TSQLQuery是,AFAIK(我從不使用它)。如果您將查詢附加到DBGrid,則使用單向數據集將是無用的;如果您只能在網格中向下滾動並且永不向後滾動,則這不會是非常有用的用戶界面。 :-)爲什麼你不使用FireDAC? –