如何使用TClientDataSet查找包含字符串

我正在使用Delphi 2007。

我知道我可以使用TClientdataset的.locate方法来查找记录,例如:

myClient.locate('name','John',[loPartialKey,loCaseInsensitive]);

但是,假设我要查找名称中包含“ John”的任何记录,例如

  

类似于“%John%”的名称

将在常规SQL表达式中完成。

使用.locate方法可以吗?

[loPartialKey]看起来像是从而不是包含开始。

lingfan2 回答:如何使用TClientDataSet查找包含字符串

在.Locate中,loPartialKey与字段值中的第一个字符匹配,因此,仅使用.Locate就无法执行所需的操作。

但是,TClientDataSet 的Filter属性可以包含like,如 将CDS的Filter属性设置为

AField like '%w%'  // matches all AField values containing `w`

或者用代码

  ClientDataset1.Filtered := False;
  ClientDataset1.Filter :=  'AField like ' + QuotedStr('%' + edFilter.Text + '%');
  ClientDataset1.Filtered := True;

因此,您可以使用过滤器来缩小行数,并使用“定位”查找特定的行,或者简单地遍历过滤后的行以找到所需的确切行。

,

不。在第一部分可以部分匹配。如“使用定位”帮助中所述。

  

Locate将光标移动到与一组指定的匹配的第一行   搜索条件。以其最简单的形式,传递找到a的名称   要搜索的列,要匹配的字段值和选项标志   指定搜索是否不区分大小写或是否可以使用   部分键匹配。 (部分键匹配是当标准   字符串只需要是字段值的前缀。)例如,   以下代码将光标移动到CustTable的第一行   “公司”列中的值为“ Professional Divers,Ltd。”:

var
  LocateSuccess: Boolean;
  SearchOptions: TLocateOptions;
begin
  SearchOptions := [loPartialKey];
  LocateSuccess := CustTable.Locate('Company','Professional Divers,Ltd.',SearchOptions);
end;

ref:Delphi online documentation: Using Locate

,

LocateRecord在内部使用DSCursor.LocateWithFilter,因此我相信可以根据自己的意愿编写自定义方法

,

最好使用 .FindFirst 和 .FindNext :

myDataset.Filter := 'CustomerName LIKE ' + ('*' + edtSearch.Text + '*').QuotedString;
myDataset.Filtered := False;
Found :=  myDataset.FindFirst

if Found then

当您要搜索知道确切值的键时,请使用 .Locate。

并且仅使用 Filtered := true 就可以了,适用于您不介意其他记录是否会在 dbGrid 上消失的情况。

本文链接:https://www.f2er.com/2982799.html

大家都在问