2

アプリケーションでは、DevExpress ExpressQuantumGrid v3 (TdxDBGrid) と ExpressQuantumGrid Suite v12 (TcxGrid) を使用します。TdxDBGrid では、TdxDBTreeListColumn.OnFilterStringFormat および OnFilterStringUnformat イベントを使用して、列に関連付けられた基本データ型の値の文字列表現を使用してフィルター処理できるようにします。たとえば、期間がミリ秒単位で保存されていても、HH:MM:SS 形式で表示される場合があります。

しかし、私は TcxGrid でこれを行う方法にこだわっています。TcxGridDBBandedColumn.OnGetFilterDisplayText を TdxDBTreeListColumn.OnFilterStringFormat の類似物として使用できますが、TdxDBTreeListColumn.OnFilterStringUnformat によって提供される機能を実装して、ユーザーが指定した表示値から格納されている値に確実に変換できるようにする方法に行き詰まっています。基礎となるデータセット。

この機能は TcxGrid でどのように実現されますか?

4

1 に答える 1

2

あなたの質問を 100% 理解しているかどうかわかりません。私はあなたが何を意味するのか分かりません

TdxDBTreeListColumn.OnFilterStringUnformat によって提供される機能を実装して、ユーザーが指定した表示値を基になるデータセットに格納されている値に変換できるようにする方法に行き詰まっています。

まず、小さな例を作成しました。

日付フィールドを含む新しい TdxMemtable を追加し、それを tcxGrid にリンクして、いくつかのランダム データを追加しました。

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
  BeginOfYear: TDateTime;
begin
  Randomize;
  dxMemData1.Active := true;
  dxMemData1.DisableControls;
  BeginOfYear := EncodeDate(2015, 1, 1);

  for i := 0 to 500 do
    dxMemData1.AppendRecord([i, Random(Trunc(Date - BeginOfYear)) + BeginOfYear]);

  dxMemData1.EnableControls;
end;

次に、列に OnGetFilterDisplayText イベントを与えました。

procedure TForm1.cxGrid1DBTableView1Field2GetFilterDisplayText(Sender: TcxCustomGridTableItem; const AValue: Variant; var ADisplayText: string);
begin
  if VarIsType(AValue, varDate) then
    ADisplayText := FormatDateTime(FormatSettings.LongDateFormat, AValue);
end;

そして、それは私が望んでいた結果を私に与えます:

OnGetFilterDisplayTextイベントなし:

ここに画像の説明を入力

そしてOnGetFilterDisplayTextイベントで:

ここに画像の説明を入力

ご覧のとおり、内部データを変更せずに、フィルター ボックス内のテキストを書式設定しました。

最後に、列に を追加して、必要な形式でデータを表示しますOnGetDataText

procedure TForm1.cxGrid1DBTableView1Field1GetDataText(Sender: TcxCustomGridTableItem; ARecordIndex: Integer; var AText: string);
var
  aDateTime: TDateTime;
begin
  if TryStrToDate(AText, aDateTime) then
    AText := FormatDateTime(FormatSettings.LongDateFormat, aDateTime);
end;

そして、ここに結果があります:

ここに画像の説明を入力

後:

ここに画像の説明を入力

このようにすることで、データセット内のデータを内部形式で保持しながら、ユーザーごとに表示することができます。

画面上の元のデータ値とデータ値を取得する方法を示すために、2 つの tcxEdit と AfterScrollEcent を mu データセットに追加しました。

procedure TMainForm.gridDBTableView1FocusedRecordChanged(Sender: TcxCustomGridTableView; APrevFocusedRecord, AFocusedRecord: TcxCustomGridRecord; ANewItemRecordFocusingChanged: Boolean);
var
  Index: Integer;
begin
  if AFocusedRecord = nil then
    exit;

  Index := gridDBTableView1time_field.Index;
  cxTextEdit1.Text := AFocusedRecord.Values[Index];
  cxTextEdit2.Text := AFocusedRecord.DisplayTexts[Index];
end;

結果は次のとおりです。

ここに画像の説明を入力

これまでのところ、希望どおりにデータが表示されており、ヘッダーからのフィルタリングは可能ですが、カスタム フィルタリングを選択するとエラーが発生します。

その作業を行うには、TcxFilterComboBoxHelper子孫を作成する必要がありますか?

type
  TmyFilterComboBoxHelper = class(TcxFilterComboBoxHelper)
  private
    class function TryLongDateFormatToDate(const S: string; out Value: TDateTime): Boolean;
    class function TryStringToMilliseconds(const S: string; out Value: Int64): Boolean;
  public
    class procedure GetFilterValue(AEdit: TcxCustomEdit; AEditProperties: TcxCustomEditProperties; var V: Variant; var S: TCaption); override;
  end;

完全なコードはここにあります: http://pastebin.com/A1NRNg2J

于 2015-04-22T06:29:17.023 に答える