我正在尝试创建一个Delphi网格,以允许在数据库网格中显示和编辑每行可能具有不同数据类型的数据。我想为每种数据类型显示一个特定的控件,例如当数据类型是DateTime时,我想显示我的自定义编辑控件,允许在日历中键入日期或弹出日历。
数据看起来像这样:
Name DataType DateValue StringValue BooleanValue
---------------------------------------------------------
A Date 1/1/2007
B String asdf
C Boolean True
...在db中,此表有一个列,表示每种可能的值类型。因此,有一个BooleanValue
列,DateValue
等。
我想要做的是在网格中显示一个“值”列,该列显示相应的编辑控件,具体取决于该行的“DataType”。因此,网格应如下所示:
Name DataType Value
---------------------------
A Date 1/1/2007
B String asdf
C Boolean True
我似乎需要根据Value
列的值动态显示每行的不同编辑控件(以允许用户编辑DataType
列)。我知道那里有更多高级网格来处理这类问题,但除了德尔福开箱即用之外,其他功能都不会允许。
关于如何制作这样的作品的任何想法?
答案 0 :(得分:4)
就个人而言,在这种情况下,我不会直接在TDBGrid
内进行编辑,因为你的表没有DB规范化(我实际上并没有在任何情况下使用它)。我会使用一个计算字段来显示网格中所需的值,并在表单上为每个字段类型动态创建TDBxxxEdit
(你自己的TDBTreeEdit
怎么样?例如,TDBRichEdit
或DB Image拾取编辑器等......?)。
如果您确实想在TDBGrid
上使用自己的控件,并替换默认的TInplaceEdit
编辑器,可以参考以下文章:Adding components to a DBGrid和相关文章: Displaying and editing MEMO fiels in Delphi's TDBGrid
答案 1 :(得分:3)
显示同一列中的所有数据非常简单。您只需添加一个计算字符串字段,然后根据您在该行中存储的内容更改该值。
编辑相当复杂。如果你想拥有一个就地编辑器,那么你将面临一个受伤的世界......我已经做到了,这很痛苦,而且需要花费很多时间。如果要显示编辑值的对话框,则更容易。您可以将列对象添加到网格中,并且可以设置已附加到calc字段的列以显示按钮。单击该按钮时,只需显示该行所需的编辑对话框,并在关闭对话框时提交编辑。
还有其他方法可以完成这项工作,但我会说上面的方法是最简短的。其他方式可能包括自定义绘制事件以在一列中显示您的数据,拦截点击以创建您自己的编辑器等,等等...
答案 2 :(得分:0)
。
样品:
procedure OnCalculate(DataSet:TDataSet);
begin
case IndexText(DataSet['ValueType'],['Date','String','Boolean']) of
0:DataSet['DateValue']:=StrToDateTime(DataSet['Value']); // also converting
1:DataSet['StringValue']:=DataSet['Value'];
2:DataSet['BooleanValue']:= MatchText(DataSet['Value'],['1','True','T','Y','Yes']);
{etc datatypes}
end;
end;