2010-10-22 75 views
2

有没有办法访问在Devart(Core Lab)TCRDBGrid搜索栏中输入的文本?如何访问TCRDBGrid组件中的搜索文本?

我试着实现OnKeyDown事件,但事件没有发生在搜索字段中,只有当网格本身被选中时才会发生。没有其他看起来相关的事件。

该文本似乎进入TditGridTitleEdit,它是TCRDBGrid的一部分,但是私人的一部分的TEdit。

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

例TCFGBGrid:

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

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

回答

3

TCRDBGrid是随源代码一起分发的。您可以修改源代码:

声明事件类型:

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

添加在TCRGridTitleEdit类的事件声明:

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; 
+0

感谢您,包括您的回复代码,非常感谢:) – WileCau 2010-10-25 09:17:59