3

データベースのロード時に、dbgridコントロールの特定のセルの内容を変更したいと思います。たとえば、データベースのフィールドが「禁止」に等しい場合、データベースのフィールドをdbgridに表示したくないとします。それができる方法はありますか?

4

6 に答える 6

5

Going to your original question:

Use the OnGetText event of the field to provide a different value from what is stored on the database for presentation purposes.

The DisplayText boolean parameter will be True if the value is required to be presented to the user and will be False if the value is required for other purposes.

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 を同期することはお勧めできません。UI Logic をビジネス ロジックから分離して、DataSource イベントを使用してそれを行うことができます。

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;

ODの提案は避けるべきものであるため、受け入れられた回答がある場合でもこれを公開します。

于 2011-02-04T21:28:53.397 に答える
2

'forbidden'文字列を持つ行(タプル)を含まないように、グリッドにデータを提供するクエリを変更します。これは、データベースからデータを取得した後でデータを表示しないようにするよりもはるかに簡単なようです。

于 2011-02-06T07:07:25.697 に答える
2

Hookup OnAfterOpen event on dataset. Get the hidden fields and set its Visible property to False and your dbgrid will not display them

Cheers

于 2011-02-04T21:37:38.630 に答える