【发布时间】:2011-01-19 15:22:24
【问题描述】:
我需要不断地实时刷新 dbgrid。关闭和打开数据集工作正常,但闪烁 dbgrid。我该怎么做才能避免这种情况?
我想要一个像 Ajax 这样的解决方案,它只更新必要的内容。
谢谢
【问题讨论】:
标签: ajax delphi dataset dbgrid
我需要不断地实时刷新 dbgrid。关闭和打开数据集工作正常,但闪烁 dbgrid。我该怎么做才能避免这种情况?
我想要一个像 Ajax 这样的解决方案,它只更新必要的内容。
谢谢
【问题讨论】:
标签: ajax delphi dataset dbgrid
您是否尝试过使用Disable-&EnableControls?
DataSet.DisableControls;
try
DataSet.Close;
DataSet.Open;
finally
DataSet.EnableControls;
end;
此外,应该只需调用DataSet.refresh而不是关闭和打开以获得相同的结果。
【讨论】:
我在我的应用程序中使用它
DataSet.MergeChangeLog;
DataSet.ApplyUpdates(-1);
DataSet.Refresh;
上面的代码在一个名为actRefreshData的action中,在ActionManager
当我需要使用时,我就这样称呼它
actRefreshData.Execute;
希望这会有所帮助。
提示:您可以添加 Timer 并自动执行此操作
【讨论】:
看这里:
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;
【讨论】: