Delphi网格,每行具有不同的数据类型,动态显示

Delphi网格,每行具有不同的数据类型,动态显示,delphi,tdbgrid,Delphi,Tdbgrid,我试图创建一个Delphi网格,以允许在db网格中显示和编辑每行上可能有不同数据类型的数据。我想为每种数据类型显示一个特定控件,例如,当数据类型为DateTime时,我想显示我的自定义编辑控件,该控件允许在日历中键入日期或弹出日历 数据如下所示: Name DataType DateValue StringValue BooleanValue --------------------------------------------------------- A

我试图创建一个Delphi网格,以允许在db网格中显示和编辑每行上可能有不同数据类型的数据。我想为每种数据类型显示一个特定控件,例如,当数据类型为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
似乎我需要根据
数据类型
列的值为每一行显示不同的编辑控件(以允许用户动态编辑
列)。我知道有更先进的网格可以处理这类问题,但它的强大功能只允许Delphi开箱即用


关于如何使这样的东西工作,有什么想法吗?

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


如果您确实想在
TDBGrid
上使用自己的控件,并替换默认的
TInplaceEdit
编辑器,您可以参考以下文章:,以及相关文章:

在同一列中显示所有数据非常容易。您只需添加一个计算字符串字段,并根据存储在该行中的内容更改值

编辑工作要复杂得多。如果你想有一个合适的编辑,你会受到伤害。。。我已经做到了,这很痛苦,而且需要很多时间。如果您想显示一个对话框来编辑该值,那就容易多了。可以将列对象添加到轴网中,也可以将附着到“计算”字段的列设置为显示按钮。单击按钮后,您只需显示该行所需的编辑对话框,并在对话框关闭时提交编辑


还有其他方法可以做到这一点,但我想说,上述方法将是最短的方法。其他方式可能包括自定义绘图事件以在一列中显示数据、拦截单击以创建自己的编辑器等。

添加计算字段后
样本:


这听起来像是你要超载你的网格的“OnDraw”事件试图找到一个开箱即用的解决方案或第三方控件是毫无意义的。您所说的不符合数据表的概念。数据库中的字段是什么类型的?String?在数据库中,DateValue是DateTime,StringValue是String,BooleanValue是BIT,等等。greatis有一组inspector组件,包括一个TDBinString。它可以满足您的需要,但不是免费的:
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;