我有一個網格的條目,用戶將點擊進行多選。根據第一個選定行的值,某些條目將無效。DBGrid:如何防止被選中的行?
我知道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;
我曾嘗試OnMouseDown
事件Application.OnMessage
和DBGrid中和形式,但他們沒有工作,也沒有TBookmarkList.BeforeInsertItem
事件。我可以做什麼或者我必須改變?
你Q的標題似乎並不符合你的Q的文本描述。你是否試圖阻止用戶選擇網格中的一些行?如果是這樣,爲什麼不阻止他們首先顯示,例如通過在網格的數據集上使用過濾器? –
第一部分:是的。其次,因爲用戶需要查看數據,然後決定選擇什麼,而不是之前......我完成了您可以想象的所有過濾器事項,但我無法更改用戶需求 –
一旦用戶做出第一次選擇(這是您想要禁用*行的點),您可以過濾以刪除不符合條件的行,這從UI角度來看非常乾淨。雖然您可能會以阻止用戶選擇某些行的方式進行破解,但此時您不能以不同的方式繪製它們以指示它們已禁用(不可選)。 –