【发布时间】:2014-08-24 16:58:55
【问题描述】:
使用 d5、TDBGrid、SQLite3 和 ZEOS。数据库有 2000 个项目,一个 Column 是“Active”作为 Boolean,第二个 Column 是“ItemName”作为 Text,IndexFiledNames 是“ItemName”
OnDblclick 切换“活动”开/关,所有数据都按预期工作。活动从 True 变为 False 并再次返回。
但是,如果我双击 DBGrid 的最后一个可见行来切换 Active 状态 - 在切换之后,DBGrid 将该项目 Row 移动到网格的垂直中心 Row 位置。这对于刚刚双击的 Row 的用户来说是非常混乱的。
如何阻止网格将该行移到中间? DGBGrid 的最后一个可见行上的所有项目都会发生这种情况。
{EDIT} 已删除的项目是试图减少问题 - 没有奏效。
procedure TfrmMain.dbgridItemsDblClick(Sender: TObject);
begin
puItemsSelectedClick(Self);
end;
procedure TfrmMain.puItemsSelectedClick(Sender: TObject);
//var
// CurrItem : String;
// CurrIndx : String;
begin
if dm.tblItems.RecordCount = 0 then
begin
myShowMsg('There are no Items in the Items List');
Exit;
end;
// CurrItem:=dm.tblItems.FieldByName(fldItemGroupShop).AsString;
// CurrIndx:=dm.tblItems.IndexFieldNames;
dm.tblItems.DisableControls;
try
// dm.tblItems.IndexFieldNames:='';
dm.tblItems.Edit;
dm.tblItems.FieldByName(fldSelected).AsBoolean:=
not(dm.tblItems.FieldByName(fldSelected).AsBoolean);
dm.tblItems.Post;
// dm.tblItems.IndexFieldNames:=CurrIndx;
// dm.tblItems.Locate(fldItemGroupShop,CurrItem,[]);
finally
dm.tblItems.EnableControls;
end;
end;
【问题讨论】:
-
IIRC,认为这样做的原因是 TDBGrid 有一个内置的偏差(在它的编码方式上)试图将当前行保持在网格的垂直中心附近。保存对当前行的更改时,会触发数据集通知控件其光标已滚动,这会提示网格尝试将行重新居中,这就是它从底部移开的原因。但是,话虽如此,我刚刚尝试了您所描述的内容,并且该行并没有从底部移开,所以您能否将 DBGrid1DblClick 中的代码添加到您的 q 中。
-
@MartynA 谢谢马丁,但我认为那里的一切都很无害。 :) 当你的不动时,你在使用 D5 吗?它可能是早期版本的“功能”。我有企业版,所以我有源代码,但不知道从哪里开始寻找停止行为。我也尝试了几个 dbgrid-Components,但它们似乎都基于 TDBGrid 并且都做同样的事情。
-
有什么方法可以保存当前的可见行号或位置,然后在编辑后强制 DBGrid 重新绘制它吗?
-
使用 D7,但如果网格的行为与 D5 不同,我会感到惊讶。是的,有一种强制行值的方法,我正在研究它,但它不仅仅是设置一个新值。如果可以的话,我应该发布我目前得到的答案并在以后填写吗?
-
右侧第一个“相关”的相关/重复(Delphi - 恢复 DBGrid 中的实际行)