我不确定我是否 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
事件:
并有一个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;
在这里你有结果:
后:
通过这样做,您可以将数据以内部格式保存在数据集中,但将其显示给不同的用户。
为了向您展示如何在屏幕上获取原始数据值和数据值,我向 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;
这是结果:
到目前为止,我们已经按照我们想要的方式显示了数据,并且可以从标题中进行过滤,但是如果您从选择自定义过滤中获得错误信息。
为了完成这项工作,您需要创建一个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