首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TDBGrid复制行

TDBGrid复制行
EN

Stack Overflow用户
提问于 2019-03-18 19:00:56
回答 1查看 361关注 0票数 2

我正在转换一些软件从德尔菲5到德尔福10.2。

我们有一个链接到数据源的TDBGrid,该数据源是一个表的链接。所以就像这样:

代码语言:javascript
复制
TDBGrid.DataSource := GroupDS;
GroupDS.DataSet := MemoryTable;

MemoryTable中有1条记录。然而,无论我尝试了什么,TDBGrid都是在复制单个记录。这种行为只发生在D10.2中。在D5中,它通常显示单个记录。我可以调用表上的RecordCount并验证其中只有1条记录。

如果我能提供任何其他信息,请告诉我。这一切都发生在VCL的东西,所以没有太多的代码显示。我不知道在发行IDEs的20年中是否有什么改变。

我编写了一个测试应用程序来重新创建这个问题。

代码:

代码语言:javascript
复制
EmpGrpMember := InitializeACRTable;

EmpGrpMember.InMemory := True;
EmpGrpMember.IndexDefs.Add('GroupGUID', 'GroupGUID', [ixPrimary, ixUnique]);
EmpGrpMember.IndexDefs.Add('GroupName', 'GroupName', [ixUnique]);
EmpGrpMember.IndexName := 'GroupName';
EmpGrpMember.FieldDefs.Add('GroupGUID', ftString, 40);
EmpGrpMember.FieldDefs.Add('GroupName', ftString, 100);
EmpGrpMember.TableName := 'EmpGrpMember';

EmpGrpMemberDS.DataSet := EmpGrpMember;
DBGrid1.DataSource := EmpGrpMemberDS;
EmpGrpMember.Open;
EmpGrpMember.Insert;
EmpGrpMember.FieldByName('GroupGUID').AsString := '123';
EmpGrpMember.FieldByName('GroupName').AsString := 'wwww';
EmpGrpMember.Post;

dfm:

代码语言:javascript
复制
object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 336
  ClientWidth = 635
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  OnCreate = FormCreate
  PixelsPerInch = 96
  TextHeight = 13
  object DBGrid1: TDBGrid
    Left = 144
    Top = 96
    Width = 225
    Height = 121
    Options = [dgTitles, dgColumnResize, dgColLines, dgRowLines, dgTabs, dgRowSelect, dgAlwaysShowSelection, dgConfirmDelete, dgCancelOnExit]
    TabOrder = 0
    TitleFont.Charset = DEFAULT_CHARSET
    TitleFont.Color = clWindowText
    TitleFont.Height = -11
    TitleFont.Name = 'Tahoma'
    TitleFont.Style = []
    Columns = <
      item
        Expanded = False
        FieldName = 'GroupName'
        Title.Caption = 'Member of Groups'
        Width = 191
        Visible = True
      end>
  end
  object EmpGrpMemberDS: TDataSource
    Left = 488
    Top = 216
  end
end

我还是得到了同样的结果。我的dbgrid最终显示了4 'www‘,它应该只显示1。我在表上做了一个.recordcount,它只显示了一个记录。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-18 19:28:35

下面的最小示例项目实际上完全复制了您的项目,只不过它使用TClientDataSet作为数据集而不是AddAim数据集。

它只正确地显示了一行。因此,问题在于TACRTable的使用。因此,除非您运气好,并且这里的人认识到了这个问题并知道如何解决它,否则您需要使用AddAim解决这个问题。

代码:

代码语言:javascript
复制
  type
    TForm1 = class(TForm)
      DataSource1: TDataSource;
      DBGrid1: TDBGrid;
      EmpGrpMember: TClientDataSet;
      procedure FormCreate(Sender: TObject);
    public
    end;

  [...]
  procedure TForm1.FormCreate(Sender: TObject);
  var
    AField : TField;
  begin
    AField := TStringField.Create(Self);
    AField.FieldKind := fkData;
    AField.FieldName := 'GroupGUID';
    AField.Size := 255;
    AField.DataSet := EmpGrpMember;

    AField := TStringField.Create(Self);
    AField.FieldKind := fkData;
    AField.Size := 255;
    AField.FieldName := 'GroupName';
    AField.DataSet := EmpGrpMember;

    EmpGrpMember.IndexDefs.Add('GroupGUID', 'GroupGUID', [ixPrimary, ixUnique]);
    EmpGrpMember.IndexDefs.Add('GroupName', 'GroupName', [ixUnique]);
    EmpGrpMember.IndexName := 'GroupName';

    EmpGrpMember.CreateDataSet;
    EmpGrpMember.InsertRecord(['123', 'www']);

  end;

当然,如果您可以通过修改上面的项目来复制您的问题,那么可能会有一些值得研究的地方。

要调试问题,请为网格的事件设置一个处理程序,如下所示

代码语言:javascript
复制
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  DataCol := DataCol;
end;

在里面放个断点。当断点运行时,您会发现从它跟踪到VCL源,最终会在while过程中到达Grids.Pas过程中的一个Grids.Pas循环。检查while的条件应该会显示为什么要显示两次行。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55228364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档