データベースのロード時に、dbgridコントロールの特定のセルの内容を変更したいと思います。たとえば、データベースのフィールドが「禁止」に等しい場合、データベースのフィールドをdbgridに表示したくないとします。それができる方法はありますか?
6 に答える
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;
DataSetNotifyEvent Afteropenを使用できます
DBGrid.Datasource.Dataset.Afteropen :=
次の方法でフィールドを非表示にできます。
条件の場合、DBGrid.columns[x].visible := false
または、特定のセルの一部のコンテンツを上書き/削除するために、OnDrawColumnCell イベントの条件を確認できます。
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の提案は避けるべきものであるため、受け入れられた回答がある場合でもこれを公開します。
'forbidden'文字列を持つ行(タプル)を含まないように、グリッドにデータを提供するクエリを変更します。これは、データベースからデータを取得した後でデータを表示しないようにするよりもはるかに簡単なようです。
Hookup OnAfterOpen event on dataset. Get the hidden fields and set its Visible property to False and your dbgrid will not display them
Cheers