繁体   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