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

3

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

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;

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;

我发布这篇文章,即使你已经有了一个被接受的答案,因为O.D.的建议是你应该避免的。

我接受了O.D.的答案,因为它起作用并且对我帮助很大。所有答案都加一分。感谢你们的帮助。 - Azad Salahli

3

您可以使用DataSetNotifyEvent Afteropen

DBGrid.Datasource.Dataset.Afteropen :=

您可以使用以下代码隐藏字段:

if Condition then DBGrid.columns[x].visible := false

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


2

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

干杯


2

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


1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接