TcxGridDBBandedColumn中的TdxDBTreeListColumn.OnFilterStringUnformat模拟在哪里?

时间:2015-04-21 23:22:19

标签: delphi devexpress tcxgrid

我们在应用程序中使用DevExpress ExpressQuantumGrid v3(TdxDBGrid)和ExpressQuantumGrid Suite v12(TcxGrid)。使用TdxDBGrid,我们使用TdxDBTreeListColumn.OnFilterStringFormat和OnFilterStringUnformat事件来允许我们使用与列关联的基础数据类型的值的字符串表示进行过滤。例如,我们可能以毫秒为单位存储时间段,但以HH:MM:SS格式显示。

但我仍然坚持用TcxGrid做到这一点。虽然我可以使用TcxGridDBBandedColumn.OnGetFilterDisplayText作为TdxDBTreeListColumn.OnFilterStringFormat的模拟,但我仍然坚持如何实现TdxDBTreeListColumn.OnFilterStringUnformat提供的功能,以确保我可以从用户指定的显示值转换为值存储在基础数据集中。

如何使用TcxGrid实现此功能?

1 个答案:

答案 0 :(得分: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;

然后我给Column一个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事件:

enter image description here

使用OnGetFilterDisplayText事件:

enter image description here

正如您所看到的,我已经在过滤器框中格式化了文本而没有修改内部数据。

所以最后一件事就是通过在列中添加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;

这里有结果:

enter image description here

之后:

enter image description here

通过这种方式,您可以将数据保存在内部格式的数据集中,但将其显示给用户不同。

为了向您展示如何在屏幕上获取原始数据值和数据值我已经将两个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;

结果如下:

enter image description here

到目前为止,我们已经按照我们想要的方式显示数据,并且从headder中过滤是可行的,但是如果您选择自定义过滤,则会出现错误。

为了完成这项工作,您需要创建一个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