好的,我正在使用一个显示数据库数据的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列(客户名称列)中有相同的客户名称
在我的例子中,我已经这样做了,你可以看到我有两个John Edwards的条目
随后,当我在搜索字段中写下该客户名称时,我希望所有这些行显示在DBGrid上,而第4列中不包含该名称的任何其他行将消失
如果使用上面的例子,一旦我在搜索字段中写了John Edwards,我应该只看到DBGrid上的那两行
一旦我清除了我写的内容的搜索字段,DBGrid应该恢复到它的初始状态并显示所有内容,就像在搜索之前一样。
知道怎么做吗?我不知道,因为我对Delphi很陌生,在这里和谷歌搜索都没有提出任何有用的东西/我能用的任何东西..
非常感谢任何帮助,非常感谢!
答案 0 :(得分:1)
如果您正在处理SQL SELECT返回的少量行,则可以使用TDataSet.Filter和TDataSet.Filtered。您可以从任何您喜欢的地方获取输入,例如普通的TEdit
。
由于您没有发布任何详细信息(例如您正在使用的数据库控件,Delphi版本,任何提供变量名称的代码或其他任何内容),这里都是非常通用的示例这可能有所帮助。我正在调用附加到DBGrid Qry
的查询,因为根据您发布的内容不知道还有什么可以调用它。 FilterRecordsButton
和ClearFilterButton
是TButtons,SearchEdit
是TEdit
。您可以随意使用任何想要切换过滤器的控件或从用户那里获取输入。
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
子句,然后重新打开查询以仅显示相关行。当然,如果没有SELECT
,你永远不应该WHERE
,所以你不需要这样做。 : - )