代码之家  ›  专栏  ›  技术社区  ›  Daniel Grillo

在Delphi中,如何在不关闭和打开数据集的情况下刷新dbgrid?

  •  7
  • Daniel Grillo  · 技术社区  · 16 年前

    我需要不断地实时刷新dbgrid。关闭和打开数据集工作正常,但会闪烁dbgrid。我该怎么做才能避免这种情况?

    我想要一个像Ajax这样的解决方案,只需要更新。

    谢谢

    3 回复  |  直到 8 年前
        1
  •  14
  •   Lieven Keersmaekers    16 年前

    你试过用吗 禁用启用控件(D) ?

    DataSet.DisableControls;
    try
      DataSet.Close;
      DataSet.Open;
    finally
      DataSet.EnableControls;
    end;
    

    此外,应该可以直接调用dataset.refresh,而不是关闭和打开以获得相同的结果。

        2
  •  0
  •   t1f    9 年前

    我在我的应用程序中使用这个

    DataSet.MergeChangeLog;
    DataSet.ApplyUpdates(-1);
    DataSet.Refresh;
    

    上述代码位于 action 已命名 Acth新生数据 ,在 ActionManager

    当我需要使用它的时候,我就这样称呼它

    actRefreshData.Execute;
    

    希望这有帮助。

    提示:您可以添加 Timer 并将其自动化

        3
  •  0
  •   Thomas Riedel    8 年前

    看这里:

    type THackDataSet=class(TDataSet); // a nice "hack" so we can access 
    //protected members
     THackDBGrid=class(TDBGrid);
    
    procedure {tdmdb.}refreshgrid(grid : tdbgrid);
    
    var row, recno : integer;
        ds : tdataset;
        b : tbookmark;
    begin
      Row := THackDBGrid(grid).Row;// or THackDataSet(ds).ActiveRecord
    
      ds := grid.datasource.dataset;
    
      RecNo := ds.RecNo;
    
      b := ds.GetBookmark;
    
      try
        ds.close;
        ds.Open;
      finally
        if (b<>nil) and ds.BookMarkValid(b) then
        try
         //      ds.GotoBookMark(b);
          ds.CheckBrowseMode;
          THackDataSet(ds).DoBeforeScroll;
          THackDataSet(ds).InternalGotoBookmark(b);
          if THackDataSet(ds).ActiveRecord <> Row - 1 then
          THackDataSet(ds).MoveBy(Row - THackDataSet(ds).ActiveRecord - 1);
          ds.Resync([rmExact{, rmCenter}]);
          THackDataSet(ds).DoAfterScroll;
        finally
          ds.FreeBookMark(b);
        end
        else if (recno<ds.RecordCount) and (recno<>ds.RecNo) then
        begin
          ds.First;
          ds.MoveBy(Max(0, recno-1));
        end;
      end;
    end;