2012-04-09 41 views
3

我正在尝试创建一个Delphi网格,以允许在每行的数据可能具有不同数据类型的数据库网格中显示和编辑。我想为每个数据类型显示一个特定的控件,例如当数据类型是DateTime时,我想显示我的自定义编辑控件,允许在日历中输入日期或弹出日历。在每行中有不同数据类型的Delphi网格,动态显示

的数据看起来是这样的:

Name DataType DateValue StringValue BooleanValue  
--------------------------------------------------------- 
A  Date  1/1/2007 
B  String     asdf 
C  Boolean        True 

...并在db,该表为每个可能的类型的值的列。所以,有一个BooleanValueDateValue

我想要做的是在网格中显示一个'值'列,显示适当的编辑控制取决于'DataType'是哪一行。因此,电网应该是这样的:

Name DataType Value  
--------------------------- 
A  Date  1/1/2007 
B  String  asdf 
C  Boolean True 

看来我需要显示不同的编辑控件(允许用户编辑Value列)的每一行动态基础上,DataType列的值。我知道那里有更先进的网格来处理这类问题,但是这些功能不会允许任何东西,但Delphi可以提供的开箱即用功能。

关于如何做这种工作的任何想法?

+0

这听起来像是你将被超载网格的“的OnDraw”事件 – paulsm4 2012-04-09 18:47:45

+2

试图找到一个开箱即用解决方案或第三方控制,这是毫无意义的。你所说的不符合数据表概念。 – 2012-04-09 18:50:22

+0

数据库中的字段是什么类型?串? – 2012-04-09 19:29:59

回答

4

就我个人而言,在这种情况下,我不会直接在TDBGrid内进行编辑,因为您的表格不是DB标准化的(在任何情况下我都没有使用它)。我将使用计算字段显示期望值在网格中,并动态创建表格中的每个字段类型的TDBxxxEdit(例如,您自己的TDBTreeEdit例如,TDBRichEdit或DB图像拾取编辑器,等等...?)。

在你想使用的TDBGrid自己的控件,并替换默认TInplaceEdit编辑器,你可以参考下面的文章情况:Adding components to a DBGrid,以及相关文章:Displaying and editing MEMO fiels in Delphi's TDBGrid

3

显示所有数据的同一列很容易。您可以简单地添加计算的字符串字段,并根据您在该行中存储的内容更改值。

编辑比较复杂。如果你想拥有一个就地编辑器,那么你将面临一个受到伤害的世界......我已经做到了,这是一种痛苦,需要很长时间。如果你想显示一个对话框来编辑这个值,那就容易多了。您可以将一个列对象添加到网格中,并且可以将已附加到calc字段的列设置为显示一个按钮。单击按钮时,只需显示该行所需的编辑对话框,并在关闭对话框时提交编辑。

还有其他方法可以完成这项工作,但我会说上述方法是最短的方法。其他方式可能包括自定义绘制事件以在一列中显示数据,拦截点击以创建您自己的编辑器等,等等,等等......

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;