gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 23:53:40 26 4
gpt4 key购买 nike

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

但我不知道如何使用 TcxGrid 做到这一点。虽然我可以使用 TcxGridDBBandedColumn.OnGetFilterDisplayText 作为 TdxDBTreeListColumn.OnFilterStringFormat 的模拟,但我一直困惑于如何实现 TdxDBTreeListColumn.OnFilterStringUnformat 提供的功能,以确保我可以从用户指定的显示值转换为存储在中的值底层数据集。

如何使用 TcxGrid 实现此功能?

最佳答案

我不确定我是否 100% 理解您的问题。我不确定你的意思

I'm stuck with how to implement the functionality provided by TdxDBTreeListColumn.OnFilterStringUnformat, to ensure I can convert from the display value specified by the user to the value stored in the underlying dataset.

首先我做了一个小例子:

添加了一个新的 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 事件:

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

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

为了向您展示如何获取原始数据值和屏幕上的数据值,我在 mu 数据集中添加了两个 tcxEdit 和一个 AfterScrollEcent:

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

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

为了使其工作,您需要创建一个 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

关于delphi - TcxGridDBBandedColumn 中的 TdxDBTreeListColumn.OnFilterStringUnformat 模拟在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29784924/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com