3

我想在加载数据库时修改 dbgrid 控件中特定单元格的内容。例如,假设我不希望任何数据库字段在 dbgrid 中显示,如果它等于"forbidden"。有什么办法可以做到吗?

4

6 回答 6

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;
于 2011-02-04T21:36:56.097 回答
3

您可以使用 DataSetNotifyEvent Afteropen

DBGrid.Datasource.Dataset.Afteropen :=

您可以使用以下命令隐藏字段:

如果条件则 DBGrid.columns[x].visible := false

或者,您可以检查 OnDrawColumnCell 事件的条件,以便覆盖/删除特定单元格中的某些内容

于 2011-02-04T20:44:53.593 回答
3

使用 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 建议正是你应该避免的。

于 2011-02-04T21:28:53.397 回答
2

在数据集上连接 OnAfterOpen 事件。获取隐藏字段并将其 Visible 属性设置为 False,您的 dbgrid 将不会显示它们

干杯

于 2011-02-04T21:37:38.630 回答
2

我将修改向网格提供数据的查询,以免包含具有“禁止”字符串的行(元组)。这似乎比在从数据库中检索到数据后努力不显示数据要容易得多。

于 2011-02-06T07:07:25.697 回答
1

我认为最好的方法是不要从 DATABASE_TABLE 中选择字段 WHERE SOME_VALUE="forbidden"

于 2011-03-01T14:19:57.600 回答