【发布时间】:2016-04-19 16:40:59
【问题描述】:
我有一个条目网格,用户将单击以对进程进行多选。根据第一个选定行的值,某些条目将无效。
我知道DBGrid.SelectedRows.CurrentRowSelected,但我找不到合适的地方来检查我的条件以将其设置为 True 或 False。
类似这样的:
var
bm: TBookmark;
CachedIdentity: String;
CanSelect: Boolean;
begin
with dgbSkypeConversations do
begin
if SelectedRows.Count > 0 then
begin
DataSource.DataSet.DisableControls;
bm := DataSource.DataSet.GetBookmark;
CachedIdentity := DataSource.DataSet.FieldByName('identity').AsString;
DataSource.DataSet.GotoBookmark(SelectedRows[0]);
CanSelect := DataSource.DataSet.FieldByName('identity').AsString <> CachedIdentity;
DataSource.DataSet.GotoBookmark(bm);
DataSource.DataSet.FreeBookmark(bm);
SelectedRows.CurrentRowSelected := CanSelect;
DataSource.DataSet.EnableControls;
end;
end
end;
我已经在Application.OnMessage 以及 DBGrid 和 Form 中尝试了 OnMouseDown 事件,但它们不起作用,并且没有 TBookmarkList.BeforeInsertItem 事件。我可以做什么或必须改变什么?
【问题讨论】:
-
您的 q 标题似乎与您在 q 文本中描述的内容不符。您是否试图阻止用户选择网格中的某些行?如果是这样,为什么不首先阻止它们显示,例如通过在网格的数据集上使用过滤器?
-
第一部分:是的。其次,因为用户需要查看数据然后决定选择什么,而不是之前...我已经完成了您可以想象的所有过滤器,但我无法更改用户要求
-
一旦用户进行了第一次选择(这是您要禁用行的点),您可以过滤以删除不符合条件的行,这样更简洁从用户界面的角度来看。虽然您可能会以某种方式阻止用户选择某些行,但此时您不能以不同的方式绘制它们以表明它们已被禁用(不可选择)。