我们有一个包含字段(作为整数)的成员表来定义"成员资格的状态"通过他的身份。例如:0表示非活动,1表示活动,2表示生命时间,3表示退休,4表示特殊成就等,
我们使用LiveBindings将StringGrid附加到Members表。因此,在网格中我们看到状态的ID号(1或2或等)。但我们希望看到"标签"那个状态(例如:LifeTime)而不是他的身份。
有关信息,"状态标签"不能存储在Lookup表中,因为它必须用不同的语言翻译。
我创建了一个包含状态ObjMemberStatus:TObjectList<TMemberStatus>;
的对象
使用 TAdapterBindSource。
我可以使用 TDataGenerator 将此信息分配给ComboBox。在这种情况下,我认为这是使用ComboBox的方法,这对此非常有效。
我的问题是:如何将AdapterBindSource中包含的标签显示到网格列中?
我已经执行了一些搜索,但我没有看到如何直接使用LiveBindings。也许我已经错过了一些事情。
我也在帮助中看到我们可以添加该方法: 查找(范围查找,关键字段,键值,结果字段) 到CustumFormat属性。但没有示例显示如何使用该CustumFormat方法。我在网上搜索了它,似乎没有记录。
子问题,有没有办法绕过或挂钩一些代码到LiveBindings数据分配到组件进程?
答案 0 :(得分:0)
你似乎正在制造恶劣天气。
我很欣赏翻译的复杂性,但最直接的做法是简单地应用KISS原则并在数据集中添加计算字段,该数据集提供会员身份的文本表示。
要处理翻译,最简洁的方法当然是为不同的语言设置一个单独的成员资格状态表,并选择在运行时使用的语言。如果您不想对此感到困扰,只需使用Values
的{{1}}属性在网格DataSet的OnCalcFields事件中查找翻译。
更新说您可以将计算字段添加到FDQuery但不添加到FDMemtable是不正确的。以下代码工作正常:
TStringList
并在实时绑定的StringGrid中正确显示列ID和描述。
答案 1 :(得分:0)
正如我在评论中所说,我已经使用查找字段与包含代码和本地化描述的memtable链接。
但是最近我使用了另一种方法,在你的情况下可能更容易实现。我用这样的东西连接代码字段的GetText和SetText事件:
Procedure TSomeLookupFieldHandler.LookupFieldHandleGetText(Sender: TField; Var Text: String; DisplayText: Boolean);
Var
v: Variant;
Begin
Text := '';
If (DataSet <> Nil) And Not Sender.IsNull Then Begin
DataSet.Active := True;
v := DataSet.Lookup(KeyFieldName, Sender.Value, ResultFieldName);
If Not VarIsNull(v) And Not VarIsEmpty(v) Then
Text := v;
End;
End;
Procedure TSomeLookupFieldHandler.LookupFieldHandleSetText(Sender: TField; Const Text: String);
Var
v: Variant;
Begin
If Text.IsEmpty Or (DataSet = Nil) Then
Sender.Clear
Else Begin
DataSet.Active := True;
v := DataSet.Lookup(ResultFieldName, Text, KeyFieldName);
If Not VarIsNull(v) And Not VarIsEmpty(v) Then
Sender.Value := v
Else
Sender.Clear;
End;
End;
TSomeLookupFieldHandler对象有一个对它可以用来进行查找的DataSet的引用(我有很多像这样工作的字段)。我根据需要实例化了一个这样的对象。
如果您希望该字段是只读的,我不确定是否需要SetText事件处理程序。我的不是。
本地化描述仍然需要在某些数据集中,如TFDMemTable ...但您可以轻松修改它以在TStringList或TObjectList或其他容器上进行查找。
要使用此功能,您需要实例化此类的对象,然后连接字段或字段:
lfh := TSomeLookupFieldHandler.Create(<Some parameters to setup the lookup dataset>);
SomeField.GetText:=lfh.LookupFieldHandleGetText;
SomeField.SetText:=lfh.LookupFieldHandleSetText;
SomeDataSet.FieldByName('code').GetText:=lfh.LookupFieldHandleGetText;
SomeDataSet.FieldByName('code').SetText:=lfh.LookupFieldHandleSetText;
如果要连接许多字段,那么它更容易在TSomeLookupFieldHandler上添加一个新方法,该方法接受TField参数并进行设置。