相关疑难解决方法(0)

Delphi - 在DBGrid中恢复实际行

D6教授.

以前我们使用DBISAM和DBISAMTable.处理RecNo,它可以很好地修改(删除,编辑等).

现在我们替换为不处理RecNo的ElevateDB,很多时候我们使用Queries,而不是Tables.

查询必须重新打开以查看修改.

但是如果我们重新打开查询,我们需要重新定位到最后一条记录.定位是不够的,因为Grid在另一行中显示它.这是非常令人不安的事情,因为在修改记录进入另一行后,你很难遵循它,用户讨厌这个.

我们发现此代码:

function TBaseDBGrid.GetActRow: integer;
begin
 Result := -1 + Row;
end;


procedure TBasepDBGrid.SetActRow(aRow: integer);
var
 bm : TBookMark;
begin
 if IsDataSourceValid(DataSource) then with DataSource.DataSet do begin
  bm := GetBookmark;
  DisableControls;
  try
   MoveBy(-aRow);
   MoveBy(aRow);
   //GotoBookmark(bm);
  finally
   FreebookMark(bm);
   EnableControls;
  end;
 end;
end;
Run Code Online (Sandbox Code Playgroud)

最初的例子是使用moveby.这与Queries工作得很好,因为我们无法看到Query在后台重新打开,可视控件没有改变行位置.

但是当我们有EDBTable或Live/Sensitive Query时,MoveBy使用起来很危险,因为如果有人删除或追加新行,我们可以重新定位到错误的记录中.

然后我尝试使用BookMark(见注释).但是这种技术不起作用,因为它在另一个Row位置显示记录......

所以问题是:如何在DBGrid中强制行位置和记录?

或者,在基础DataSet刷新后,哪种DBGrid可以重定位到记录/行?

我搜索用户友好的解决方案,我理解他们,因为我试图使用这个跳过DBGrid,并且使用非常糟糕,因为我的眼睛在更新后试图找到原始记录时出现... :-(

感谢您的每一个帮助,链接,信息:dd

delphi row dataset dbgrid locate

5
推荐指数
1
解决办法
2万
查看次数

如何在刷新之前将TDBGrid记录视图恢复到条件?

可能重复:
返回到先前位置时如何避免TDbgrid滚动

我正在寻找一种方法来保存和恢复TDBGrid发生刷新后Delphi的垂直滚动位置.目前,网格重置自身,以便所选记录显示在记录列表的中间.

起初,性能LeftColTopRow似乎是解决方案,但只有LeftCol工作.该TopRow值始终为1,永不改变.它似乎是网格内部记录缓冲区的一个位置,它被设置为网格中显示的行数.也就是说,似乎FBuffers上下滑动,但TopRow始终保持为1.

我所看到的一个详细的例子是:

  • 网格显示a的11条记录TClientDataSet,从记录5开始,依次显示记录15.
  • 选定的记录光标位于记录15(视图中的最后一条记录)上.
  • 数据集通过TDataSetProvider链接到a进行刷新TADODataSet.(An .Open或.Refresh调用).
  • dataset.Locate方法用于在插入/删除时保留实际选定的记录.
  • 网格发生变化,记录15位于中心,显示记录10到20.

是否可以保存/恢复/执行任何操作,以便网格可以恢复到其原始查看配置,显示记录5-15,光标位于同一选定记录中,无论它出现在何处?

在我的许多搜索尝试中,我能找到的最接近的问题是使用TopRow,LeftCol在Delphi 3.0中解决的问题:http://www.delphigroups.info/2/79/314206.html

通过DBGrids.pas进行探讨并不是一种相对于底层数据集记录定位缓冲区指针的方法.

delphi tdbgrid

5
推荐指数
1
解决办法
2180
查看次数

标签 统计

delphi ×2

dataset ×1

dbgrid ×1

locate ×1

row ×1

tdbgrid ×1