代码之家  ›  专栏  ›  技术社区  ›  t1f

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

  •  0
  • t1f  · 技术社区  · 9 年前

    好的,我使用一个DBGrid来显示数据库中的数据。

    第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相当陌生,在这里和Google上的搜索都没有找到任何有用的东西。。

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

    1 回复  |  直到 9 年前
        1
  •  1
  •   Ken White    9 年前

    TDataSet.Filter TDataSet.Filtered .您可以从任何您想要的地方获取输入,例如普通的 TEdit .

    由于您没有发布任何详细信息(例如您正在使用的DB控件、Delphi版本、提供变量名的任何代码或任何其他),因此这里有一个非常通用的示例可能会有所帮助。我正在调用附加到DBGrid的查询 Qry ,因为根据你发布的内容,你不知道还能叫它什么。 FilterRecordsButton ClearFilterButton 是T按钮,以及 SearchEdit 泰迪 。可以随意使用您想要切换过滤器或从用户获得输入的任何控件。

    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 可能是不可接受的。在这种情况下,您最好只添加适当的 哪里 条款 SELECT 以及重新打开查询以仅显示相关行。当然,你不应该做 选择 没有 哪里 ,所以您不需要这样做。:-)

    推荐文章