使用TDBGrid
TDBGrid构件以栅格的形式显示和编辑数据集中的数据它的外观很大程度上取决于下面三个因素l 一是永久的列对象 二是永久的字段对象 三是数据集构件的ObjectView属性将影响ADT和数组字段的显示方式对于TDBGrid构件来说最重要的属性是Columns这是一个TDBGridColumns对象用于管理一组TColumn对象在设计期可以打开一个编辑器建立永久的列对象然后在对象观察器中设置列对象的属性
动态的列对象
如果TDBGridColumns的State属性设为csDefault列是动态生成的列的属性取决于字段的属性当字段的属性发生变化时列的属性也跟着变化让列动态生成的好处是可以在运行期动态地选择其他数据集而不用担心栅格是否适合于显示新的数据集例如可以用同一个TDBGrid构件先显示一个Paradox表再显示查询另一个数据库的结果在设计期无法直接修改动态列对象的属性只能修改字段对象的属性从而间接地修改动态列对象的属性
动态列对象的生存期也取决于字段对象的生存期如果数据集没有建立永久的字段对象那么当数据集关闭时所有的动态列对象也将消失注意如果在运行期把TDBGridColumns的State属性设为csDefault将删除所有的列对象然后根据数据集中的字段对象重建列对象
要能够在设计期自定义栅格就要用到永久的列对象建立了永久的列对象后如果TDBGridColumns的State属性设为csCustomized就可以独立设置每一列的属性例如默认情况下列的标题显示字段的标签即DisplayLabel属性通过修改TColumnTitle的Caption属性可以重新指定列的标题而TField的DisplayLabel属性则不会受到影响TDBGridColumns的State属性设为csCustomized适合于那些数据集的结构是固定不变的情况如果需要在运行期切换不同的数据集就不能把State属性设为csCustomized要创建永久的列对象首先要在窗体上选择TDBGrid构件然后对象观察器中单击Columns属性边上的省略号按钮将打开编辑器
刚开始的时候这个编辑器是空白的这是因为默认情况下栅格中的列对象都是动态生成的还没有永久的列对象要基于数据集中的每一个字段分别创建一个永久的列对象可以单击鼠标右键在弹出的菜单中选择Add All Fields命令要创建一个独立的永久列对象可以单击工具栏上的(Add New)按钮选择这个刚创建的列对象然后在对象观察器中设置FieldName属性指定一个字段设置Caption属性指定列的标题要删除一个列对象可以单击工具栏上的(Delete Selected)按钮如果把永久的列都删掉栅格反而能显示数据集中所有的字段这是因为永久的列删掉以后Delphi 会自动把TDBGridColumns的State属性设为csDefault并且动态生成所有的列
要调整列在栅格中显示的顺序可以用鼠标把列对象前移或后移对于永久的列对象来说它的属性的默认值仍然取自于字段除非您修改了永久列对象的属性例如默认的情况下列的标题就是字段的DisplayLabel属性如果修改字段的DisplayLabel属性列的标题将随之改变但是一旦您修改了列对象的Caption属性列的标题不再与字段的DisplayLabel属性存在联动关系它们彼此是独立的
前面讲过创建一个永久的列对象时需要设置FieldName属性指定一个字段不过您也可以让FieldName属性为空此时TColumn对象的Field属性将返回NULL并且该列在栅格中是空白的空白的列往往用于用户显示一些自定义的内容如图像或图表等几个列对象的FieldName属性可以设为同一个字段由此可见TDBGrid的FieldCount属性可能小于栅格的列数
数据源
TDataSource构件是一个非可视的构件它充当了数据集和数据控件之间的桥梁每一个数据控件都必须指定一个数据源(TDataSource构件)相应地TDataSource构件的DataSet属性必须指定一个数据集下面简单介绍一下TDataSource构件的属性和事件DataSet属性用于指定一个数据集在设计期可以在对象观察器中为DataSet属性选择一个数据集在运行期可以通过代码动态地选择数据集程序示例如下
With CustSource Do
Begin
If DataSet = Customers then
DataSet := Orders
Else
DataSet := Customers;
End;
也可以指定另一个窗体上的数据集构件例如
Procedure TForm FormCreate (Sender : TObject);
Begin
DataSourceDataset := FormTable;
End;
一般情况下TDataSource构件的名称是无关紧要的不过TDataSource构件的名称应当能反映它所连接的数据集例如假设TDataSource构件连接的数据集叫Customers相应地TDataSource构件的名称最好叫CustomersSource
Enabled属性用于控制TDataSource构件是否与数据集连接设为True表示连接设为False表示暂时断开连接如果Enabled属性设为False凡是连接于这个数据源的数据控件将变成空白如果AutoEdit属性设为True当用户在数据控件中键入字符时数据集就自动进入dsEdit状态如果AutoEdit属性设为False程序必须调用Edit函数才能进入dsEdit状态
当数据集的当前记录的位置发生变化时将触发OnDataChange事件这可能是因为程序调用了NextPreviousInsert等方法当前记录的数据将要被更新时将触发OnUpdateData事件这可能是因为调用了Post在处理这个事件的句柄中可以对数据进行校验