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

如何访问tcrdbgrid组件中的搜索文本?

  •  2
  • WileCau  · 技术社区  · 14 年前

    是否有方法访问在Devart(核心实验室)tcrdbgrid搜索栏中输入的文本?

    我尝试实现onkeydown事件,但在搜索字段中输入期间没有发生该事件,只有当选择了网格本身时。没有其他看起来相关的事件。

    文本似乎进入了一个tedit,它是tcrgridittleedit的一部分,它是tcrdbgrid的一部分,但是私有的。

    有没有办法获取搜索文本?

    示例tcfggrid:

    +---------+------------+
    | UserId  |  UserName  | <- Column titles
    +---------+------------+
    |[987654] | [        ] | <- Search bar (searching for UserId 987654)
    +---------+------------+
    | 123456  |  Wile Cau  | <- Data
    +---------+------------+
    |   ...   |    ...     | <- More data
    

    如果用户ID 987654不存在,我想提示类似“创建新用户987654?”并可能创建一个用户ID设置为987654的新记录。

    1 回复  |  直到 14 年前
        1
  •  3
  •   bork    14 年前

    tcrdbgrid与源代码一起分发。您可以修改源代码:

    声明事件类型:

      TOnTextChanged = procedure (Sender: TObject; Text: string) of object;
    

    在tcrgridittleedit类中添加事件声明:

    private 
        FOnFilterChanged: TOnTextChanged;
        FOnSearchChanged: TOnTextChanged;
    
    public
        property OnFilterChanged: TOnTextChanged read FOnFilterChanged write FOnFilterChanged;
        property OnSearchChanged: TOnTextChanged read FOnSearchChanged write FOnSearchChanged;
    

    在processedit过程中调用此事件:

    procedure TCRGridTitleEdit.ProcessEdit;
    begin
      if (FActiveColumn = nil) or (CRDBGrid = nil) or not FEdit.Modified then
        Exit;
    
      if FAsFilter then
        with CRDBGrid do begin
          try
            TCRColumn(FActiveColumn).GetFilterExpression(FEdit.Text);
            FFilterExpressions[FActiveColumn.Index] := FEdit.Text;
            Self.Caption := FFilterExpressions[FActiveColumn.Index];
            if Assigned(FOnFilterChanged) then
              FOnFilterChanged(self, FEdit.Text);
          except
            on EConvertError do begin
              FEdit.SelectAll;
              raise;
            end;
          end;
        end
      else
        try
          with FActiveColumn.Field do
            DataSet.Locate(FieldName, {$IFDEF CLR}Variant{$ENDIF}(FEdit.Text), [loCaseInsensitive,loPartialKey]);
          if Assigned(FOnSearchChanged) then
            FOnSearchChanged(self, FEdit.Text);
        except
          on EConvertError do
            Exit;
        end;
    end;
    

    并在tcrdbgrid类中添加事件声明:

    private
      function GetOnFilterChanged: TOnTextChanged;
      procedure SetOnFilterChanged(Value: TOnTextChanged);
      function GetOnSearchChanged: TOnTextChanged;
      procedure SetOnSearchChanged(Value: TOnTextChanged);
    
    published
      property OnFilterChanged: TOnTextChanged read GetOnFilterChanged write SetOnFilterChanged;
      property OnSearchChanged: TOnTextChanged read GetOnSearchChanged write SetOnSearchChanged;
    

    实施

    function TCRDBGrid.GetOnFilterChanged: TOnTextChanged;
    begin
      Result := CRGridTitleEdit.OnFilterChanged;
    end;
    
    procedure TCRDBGrid.SetOnFilterChanged(Value: TOnTextChanged);
    begin
      CRGridTitleEdit.OnFilterChanged := Value;
    end;
    
    function TCRDBGrid.GetOnSearchChanged: TOnTextChanged;
    begin
      Result := CRGridTitleEdit.OnSearchChanged;
    end;
    
    procedure TCRDBGrid.SetOnSearchChanged(Value: TOnTextChanged);
    begin
      CRGridTitleEdit.OnSearchChanged := Value;
    end;