我正在尝试创建一个Delphi网格,以允许在每行可能具有不同数据类型的数据的数据库网格中显示和编辑。我想为每种数据类型显示一个特定的控件,例如,当数据类型为 DateTime 时,我想显示我的自定义编辑控件,该控件允许键入日期或弹出日历。
数据如下所示:
Name DataType DateValue StringValue BooleanValue
---------------------------------------------------------
A Date 1/1/2007
B String asdf
C Boolean True
。在数据库中,此表为每种可能的值类型都有一列。所以,有一个BooleanValue
列, DateValue
等。
我想做的是在网格中显示单个"值"列,该列根据该行的"数据类型"显示适当的编辑控件。因此,网格应如下所示:
Name DataType Value
---------------------------
A Date 1/1/2007
B String asdf
C Boolean True
似乎我需要根据DataType
列的值为每一行动态显示不同的编辑控件(以允许用户编辑Value
列)。我知道有更先进的网格可以处理这类问题,但是除了德尔福开箱即用的功能外,不允许任何东西。
关于如何使这样的东西工作的任何想法?
就个人而言,在这种情况下,我不会直接在TDBGrid
内进行编辑,因为您的表没有数据库规范化(实际上我在任何情况下都不使用它)。我会使用计算字段在网格中显示所需的值,并在表单上为每个字段类型动态创建TDBxxxEdit
(您自己的TDBTreeEdit
怎么样,例如,TDBRichEdit
或数据库图像拾取编辑器等......
如果您确实想在TDBGrid
上使用自己的控件并替换默认的TInplaceEdit
编辑器,可以参考以下文章:将组件添加到 DBGrid,以及相关文章:在德尔福的 TDBGrid 中显示和编辑 MEMO 字段
在同一列中显示所有数据非常容易。您可以简单地添加一个计算字符串字段,并根据您存储在该行中的内容更改值。
编辑要复杂得多。如果你想有一个就地编辑器,你会受到一个受伤的世界......我已经做到了,这很痛苦,而且需要很多时间。如果要显示一个对话框来编辑值,那就容易多了。您可以将列对象添加到网格,并且可以设置附加到 calc 字段的列以显示按钮。单击该按钮后,您只需显示该行所需的编辑对话框,并在对话框关闭时提交编辑。
还有其他方法可以完成此操作,但我想说上述方法是最短的方法。其他方法可能包括自定义绘制事件以在一列中显示您的数据,拦截点击以创建自己的编辑器,等等,等等......
计算字段。
样本:
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;