2010-10-22 4 views
2

Есть ли способ получить доступ к тексту, введенному в панель поиска TCRDBGrid Devart (Core Lab)?Как получить доступ к тексту поиска в компоненте TCRDBGrid?

Я попытался реализовать событие OnKeyDown, но событие не произошло во время ввода в поля поиска, только когда была выбрана сама сетка. Других событий, которые выглядят актуальными, нет.

Текст, по-видимому, входит в TEdit, который является частью TCRGridTitleEdit, который является частью TCRDBGrid, но является закрытым.

Есть ли способ получить текст поиска?

Пример TCFGBGrid:

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

Если UserId 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

 Смежные вопросы

  • Нет связанных вопросов^_^