Delphi XE2 中 TTable 和 TDBGrid 的意外行为

Posted

技术标签:

【中文标题】Delphi XE2 中 TTable 和 TDBGrid 的意外行为【英文标题】:Unexpected behaviour of TTable and TDBGrid in Delphi XE2 【发布时间】:2012-11-26 05:30:50 【问题描述】:

我在表单上有一个文本框和一个网格。

功能:当我在文本框中输入对应于该 Emp ID 的 Emp ID(例如 1、2、3 等)时,Emp Name 应该来自数据库的网格。当我再次输入另一个 Emp ID 时,Another Emp Name 应该嵌入到下一行的网格中,依此类推……我希望多少次都没有。 emp 名称应继续以这种方式出现在网格的下一行。

我想我已经尽可能解释了我的问题。

我的方法

我为此使用 TTable、TDatasource 和 TDBGrid。当我在文本框中输入任何 Emp ID 并按 Enter 时,我会检查数据库中的 Emp Name,然后将该名称附加到 TTable。然后我将此TTable 分配给TDatasource,最后将TDatasource 分配给TDBGrid。以下是这个的代码

Table1.Close;

//Create table for the first time

if not Table1.Exists  then
begin
      Table1.Close;

      Table1.DatabaseName    := 'databaseName';
      Table1.TableType           := ttParadox;
      Table1.TableName          := 'MyTable';
      Table1.FieldDefs.Clear;
      Table1.FieldDefs.Add('EmpName',ftString,40);
      Table1.CreateTable;

      Table1.Open;
end;

   Table1.Open;
   Table1.Append;
   Table1.FieldByName('EmpName').AsString := EmpName; //EmpName is fetched from database
   Table1.Post;
//Now assign this table to datasource
       DataSource1.DataSet := Table1;
//Now assign this datasource to dbgrid
       DBGrid1.DataSource := DataSource1;

我的问题: 我的问题是,网格中显示的记录表现异常。记录没有按正确的顺序显示,而是相互混合。表示网格中的数据行未按我以前附加的顺序显示。可能是什么问题呢。在每次绑定之前我是否要刷新一些数据源或 dbgrid 或其他东西。请帮忙。

【问题讨论】:

请提出一些建议...... 【参考方案1】:

要定义记录的顺序,您必须使用索引/主键。 像下面的代码一样添加它。

Table1.FieldDefs.Add('EmpId', ftAutoInc, 0, True);
Table1.FieldDefs.Add('EmpName', ftString, 40);
Table1.IndexDefs.Add('idxEmpId','EmpId',[ixPrimary]);
Table1.CreateTable;
Table1.Open;

您可以通过定义 DBGrid.Columns 属性来隐藏 EmpId,使其无法在网格中查看,其中仅显示必要的列。

【讨论】:

以上是关于Delphi XE2 中 TTable 和 TDBGrid 的意外行为的主要内容,如果未能解决你的问题,请参考以下文章

有没有 Delphi XE2 样式库?

Delphi - 使用不同的TTable和TQuery作为一个对象

怎么设置禁止delphi Xe2 自动检查更新

Delphi XE2 数据模块只需要数据库组件?

如何改变delphi xe2编程环境下所显示的源代码的字体大小

Delphi TADOStoredProc / D6 和 RAD Studio XE2 最近的故障