添加在 DBGrid 中搜索数据并临时更改 DBGrid 显示的内容的搜索 - Delphi

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

好的,我正在使用显示数据库中数据的 DBGrid。

数据库包含一个 table,其中包含 11 列。 第 4 列称为客户名称,包含客户名称。

我想要一个搜索框(类似于 google 搜索栏),我可以在其中输入我想要的客户名称 一旦我这样做,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 个 John Edwards 的条目

随后,当我在搜索字段中写入该客户名称时,我希望所有这些行都显示在 DBGrid 上,而第 4 列中不包含该名称的任何其他行都会消失

如果使用上面的示例,一旦我在搜索字段中输入 John Edwards,我应该只会在 DBGrid 上看到那两行

一旦我清除了我所写内容的搜索字段,DBGrid 应该恢复到它的初始状态并显示所有内容,就像搜索之前一样。

知道怎么做吗?我不知道,因为我是 Delphi 的新手,在这里和 Google 上搜索都没有找到任何有用的东西/我可以使用的任何东西..

非常感谢任何帮助,非常感谢!

如果您要处理 SQL SELECT 返回的少量行,则可以使用 TDataSet.Filter and TDataSet.Filtered。您可以从任何地方获取输入,例如普通的旧 TEdit

由于您没有发布任何详细信息(例如您正在使用的数据库控件、Delphi 的版本、提供变量名称的任何代码或其他任何内容),这里有一个非常通用的示例可能有帮助。我正在调用附加到 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 而 returns 有几十万行),那么性能如果 Filtered 可能无法接受。在这种情况下,您最好将适当的 WHERE 子句添加到 SELECT 并重新打开查询以仅显示相关行。当然,您永远不应该在没有 WHERE 的情况下执行 SELECT,因此您不需要这样做。 :-)