【问题标题】:Delphi - Update field in a dbGrid while selection is on another rowDelphi - 选择在另一行时更新 dbGrid 中的字段
【发布时间】:2010-06-29 07:46:04
【问题描述】:

我有一个带有 X 行的 dbGrid。 我想用计时器更新第二行中的字段值(例如,显示倒计时)。 没问题,但我希望能够更改选定的行并继续更新第二行。 当网格中的选择发生变化时,连接数据集的当前记录也会发生变化,这是一个问题,因为计时器中的代码指向了被选择的记录。

如何解决? 谢谢!

【问题讨论】:

    标签: delphi dbgrid


    【解决方案1】:

    如果连接到 dbGrid 的数据集是 TClientDataSet,您可以删除另一个 TClientDataSet 并从网格的数据集中克隆数据。

    由于两个数据集将指向相同的数据,因此您可以更改克隆数据集中的值,并且该数据将显示在 dbGrid 中,而不会篡改 dbGrids 数据集。

    【讨论】:

    • +1。 @doubleu 如果您不知道在这种情况下使用克隆游标,请查看codegearguru.com/video/049/CloneCursor.html 这是了解克隆用法的好方法。
    • 您好,感谢您的回答。但是我对这个问题有一些疑问......我有一个这样的结构:DataSource -> ClientDataSet 和 ClientDataSetClone -> DSProvider -> TQuery。问题1:当我插入新记录时,我应该通过clientDataSet(然后使用applyUpdates)插入它们,还是应该直接使用TQuery - 还是没关系?问题2:当我使用clientDataSet插入一条记录时,这条新记录始终是dbgrid中的最后一条记录。我怎么能在顶部插入它?感谢您的帮助,并为我的愚蠢问题感到抱歉。
    • 回答我自己:) 我想我应该使用 clientDataSet 来插入新记录。在 applyUpdates 之后,我调用 tquery.refresh 来对 TQuery 和 ClientDataSet 中的数据之间的内容进行 sncronize。这也解决了我的第二个问题:当我第一次调用 tquery.refresh 然后在我的 clientDataSet 中插入一条新记录时,它是网格中的第一条记录。如果我犯了明显的错误,请告诉我。感谢你们,你们和 stackoverflow 都很棒;)
    【解决方案2】:

    试试这个非常简单的方法:

    if DataSource1.DataSet.State in dsEditModes then
      DataSource1.DataSet.Post; { or Cancel, depends on your needs }
    try
      DataSource1.DisableControls;
      Bookmark := ClientDataSet1.GetBookmark;
      try
        if ClientDataSet1.Locate(SecondRowId, 'Id', []) then
        begin
          ClientDataSet1.Edit;
          ClientDataSet1['Counter'] := Counter;
          ClientDataSet1.Post;
        end;
        ClientDataSet1.GotoBookmark(Bookmark);
      finally
        CLientDataSet1.FreeBookmark(Bookmark);
      end;
    finally
      DataSource1.EnableControls;
    end;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多