我想在加载数据库时修改 dbgrid 控件中特定单元格的内容。例如,假设我不希望任何数据库字段在 dbgrid 中显示,如果它等于"forbidden"。有什么办法可以做到吗?
6 回答
转到您的原始问题:
使用该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;
您可以使用 DataSetNotifyEvent Afteropen
DBGrid.Datasource.Dataset.Afteropen :=
您可以使用以下命令隐藏字段:
如果条件则 DBGrid.columns[x].visible := false
或者,您可以检查 OnDrawColumnCell 事件的条件,以便覆盖/删除特定单元格中的某些内容
使用 DataSet 事件来同步 UI 不是一个好习惯。您可以依靠 DataSource 事件来做到这一点,将 UI 逻辑与业务逻辑分开。
由于 DataSet 的状态将从 dsInactive 更改为 dsBrowse,因此您可以依赖 DataSource OnState 更改来在从数据库加载数据时进行任何与 UI 相关的操作。
您可以依靠辅助字段来跟踪以前的状态,以避免代码执行超出需要。
例如(未经测试的代码)
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;
即使你有一个接受的答案,我也会发布这个,因为 OD 建议正是你应该避免的。
在数据集上连接 OnAfterOpen 事件。获取隐藏字段并将其 Visible 属性设置为 False,您的 dbgrid 将不会显示它们
干杯
我将修改向网格提供数据的查询,以免包含具有“禁止”字符串的行(元组)。这似乎比在从数据库中检索到数据后努力不显示数据要容易得多。
我认为最好的方法是不要从 DATABASE_TABLE 中选择字段 WHERE SOME_VALUE="forbidden"