2011-02-04 75 views

回答

3

可以使用DataSetNotifyEvent Afteropen

DBGrid.Datasource.Dataset.Afteropen:=

,您可以使用隱藏字段:

如果條件那麼 DBGrid.columns [X] .visible:= false

替代方法您可以檢查OnDrawColumnCell事件的條件以覆蓋/刪除特定單元格中的某些內容

+1

非常感謝。它的工作:) – 2011-02-04 20:51:05

3

使用DataSet事件來同步UI並不是一個好習慣。您可以依靠DataSource事件來實現這一點,將UI邏輯與業務邏輯分開。

由於DataSet的狀態將從dsInactive更改爲dsBrowse,因此可以依賴DataSource OnState更改,以便在數據從數據庫加載數據時進行與UI相關的任何操作。

您可以依靠Auxiliar字段跟蹤以前的狀態,以避免代碼執行超過需要。

例如(未測試的代碼)

procedure TForm1.DataSource1StateChange(Sender: TObject); 
begin 
    if (DataSource1.State = dsBrowse) and (not FUIStateInSync) then 
    begin 
    //dataset is open, change UI accordingly 
    DBGrid1.Columns[0].Visible := SomeCondition(); 
    //this will prevent the code to be executed again 
    //as state comes to dsBrowse after posting changes, etc. 
    FUIStateInSync := True; 
    end 
    else if (DataSource1.State = dsInactive) then 
    FUIStateInSync := False; //to let it happen again when opened. 
end; 

我出版這甚至當你有一個公認的答案,因爲外徑建議正是你應該避免的。

+0

我接受了O.D.因爲它的效果很好,這對我有很大的幫助。對所有答案+1。謝謝你的幫助。 – 2011-02-07 05:05:21

5

去你原來的問題:

使用OnGetText事件的字段提供從什麼是存儲在數據庫中,以用於演示在不同的值。

DisplayText如果需要將值呈現給用戶,則布爾型參數將爲True,如果該值對於其他用途是必需的,則該值爲False。對數據集

procedure TForm1.SQLQuery1Field1GetText(Sender: TField; 
    var Text: string; DisplayText: Boolean); 
begin 
    if (Sender.AsString = 'forbidden') and (DisplayText) 
    and (PrivilegeLevel(CurrentUser) < 10) then 
    Text := '********' 
    else 
    Text := Sender.AsString; 
end; 
2

聯播OnAfterOpen事件。 獲取隱藏字段和它的Visible屬性設爲False和您的DBGrid不會顯示出來

乾杯

2

我會修改提供的數據網格查詢,以便不包括行(元組),其中有'禁止'字符串。這似乎比從數據庫中檢索數據後不努力不顯示數據要容易得多。

1

我認爲最好的辦法是不要選擇字段WHERE SOME_VALUE =「禁止」從DATABASE_TABLE

相關問題