当数据库加载时,我想修改dbgrid控件中特定单元格的内容。例如,假设我不想在dbgrid中显示数据库的任何字段,如果该字段等于"forbidden"。有没有办法可以做到这一点?
关于你最初的问题:
使用字段的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;
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;
您可以使用DataSetNotifyEvent Afteropen。
DBGrid.Datasource.Dataset.Afteropen :=
您可以使用以下代码隐藏字段:
if Condition then DBGrid.columns[x].visible := false
或者在OnDrawColumnCell事件中检查条件以覆盖/删除特定单元格中的某些内容。
在数据集上挂接OnAfterOpen事件。获取隐藏字段并将其Visible属性设置为False,您的dbgrid将不会显示它们。
干杯
我会修改提供数据给网格的查询,以便不包括具有“禁止”字符串的行(元组)。这似乎比尝试在从数据库检索数据后努力不显示数据要容易得多。
我认为最好的方法是不要从DATABASE_TABLE中选择WHERE SOME_VALUE="forbidden"的字段