我想在加载数据库时修改dbgrid控件中特定单元格的内容。例如,假设我不想在dbgrid中显示任何数据库字段,如果它等于“禁止”。有什么方法可以做到吗?
答案 0 :(得分: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;
答案 1 :(得分:3)
您可以使用DataSetNotifyEvent Afteropen
DBGrid.Datasource.Dataset.Afteropen:=
你可以用以下字段隐藏字段:
如果条件那么 DBGrid.columns [x] .visible:= false
替代方法您可以检查OnDrawColumnCell事件的条件,以覆盖/删除特定单元格中的某些内容
答案 2 :(得分: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;
即使你已经接受了答案,我也会发布这个,因为O.D.建议就是你应该避免的。
答案 3 :(得分:2)
数据集上的Hookup OnAfterOpen事件。 获取隐藏字段并将其Visible属性设置为False,dbgrid将不显示它们
干杯
答案 4 :(得分:2)
我会修改向网格提供数据的查询,以便不包含具有'forbidden'字符串的行(元组)。这似乎比在数据库中检索数据后不努力显示数据要容易得多。
答案 5 :(得分:1)
我认为最好的方法是不要从DATABASE_TABLE中选择字段WHERE SOME_VALUE =“forbidden”