【问题标题】:How to refresh dbgrid without close and open dataset in delphi?如何在不关闭和打开delphi数据集的情况下刷新dbgrid?
【发布时间】:2011-01-19 15:22:24
【问题描述】:

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

我想要一个像 Ajax 这样的解决方案,它只更新必要的内容。

谢谢

【问题讨论】:

    标签: ajax delphi dataset dbgrid


    【解决方案1】:

    您是否尝试过使用Disable-&EnableControls

    DataSet.DisableControls;
    try
      DataSet.Close;
      DataSet.Open;
    finally
      DataSet.EnableControls;
    end;
    
    此外,应该只需调用DataSet.refresh而不是关闭和打开以获得相同的结果。

    【讨论】:

    • 好建议!我忘记了。
    【解决方案2】:

    我在我的应用程序中使用它

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

    上面的代码在一个名为actRefreshDataaction中,在ActionManager

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

    actRefreshData.Execute;
    

    希望这会有所帮助。

    提示:您可以添加 Timer 并自动执行此操作

    【讨论】:

      【解决方案3】:

      看这里:

      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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-01
        • 2013-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-25
        相关资源
        最近更新 更多