在显示之前修改DBGrid单元格内容

时间:2011-02-04 20:33:56

标签: delphi dbgrid

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

6 个答案:

答案 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”