2011-02-04 78 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

相关问题