2016-06-29 15 views
1

上のセルを変更しましたイベント?cxgridハイライト(または色)は、私が持っているフォームのclosequeryにフォームclosequery

私は変更内容を知る必要はなく、ユーザーが変更を保存するために気候を簡単に決定できるように、どのセルが変更されたかを知るだけです。

+0

私はあなたが達成しようとしていることをもう少し詳しく説明する必要があるかもしれないと思います。同じ行の複数の列が変更された場合はどうなりますか? 「変更しました」と言うと、既にデータセットに保存されている変更を含めることを意味しますか?あなたのデータセットはApplyUpdates()をしますか? – MartynA

+0

はい、私は変更された行全体のすべてのセルを強調表示したいと思います。これはポストイベントの前に何も保存されていないためです。グリッドは[dsEdit、dsInsert]モードです。いいえ、データベースdosはapplyupdatesを呼び出しません。 – user763539

+0

これは、ユーザーがテーブルを変更し、変更をポストするのを忘れてフォームを閉じるのを試みる状況です。だから彼はフォームを閉じて(そしてすべての変更されたデータを失う)、彼がテーブルに加えた変更はまだ保存されず、変更された彼(セル)を表示することを彼に伝えていいです。わかる ?私はおそらく変更されたセルを色付けすることを考えていたので、簡単に見えるがハイライト表示になっています。 – user763539

答えて

1

cxGrid1DBTableView1CustomDrawCellイベントを使用して、何らかの方法でハイライトされたセル(または行)を描画するためにcxGridを取得するのは簡単です。また、OnCloseQueryイベントが進行中であることを示すフラグを設定することで、そのイベントをそのイベント内に制限することができます。

更新この回答で最初に投稿したコードは、現在のグリッド行に複数のセルを変更しても正常にマークできませんでした。下の更新されたコードはこれを行うことができます。手順2の のコメントに注意してください。

type 
    TForm1 = class(TForm) 
    [...] 
    public 
    QueryingClose : Boolean; 
    end; 

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); 
begin 
    try 
    QueryingClose := True; 
    //{cxGrid1.Invalidate{True); Do NOT call Invalidate, because it causes the 
    // grid's repainting logic to operate in a way which effectively makes it 
    // impossible to mark more that one cell in the current data row as changed 
    ShowMessage('Close?'); 
    finally 
    QueryingClose := False; 
    end; 
end; 

procedure TForm1.cxGrid1DBTableView1CustomDrawCell(Sender: 
    TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: 
    TcxGridTableDataCellViewInfo; var ADone: Boolean); 
var 
    Field : TField; 
    MarkCell : Boolean; 
    S1, 
    S2 : String; 
    EC : TcxGridTableEditingController; 
begin 
    if QueryingClose and 
    (TcxGridDBTableView(Sender).DataController.DataSet.State in[dsEdit, dsInsert]) then begin 
    Field := TcxGridDBColumn(AViewInfo.Item).DataBinding.Field; 
    S1 := VarToStr(Field.OldValue); 

    // When this event is called, the user may be in the middle of editing a cell's contents 
    // So, the purpose of the following lines is to close the inplace editor being used to do 
    // this amd post the chamged value back to the TField associated with the cell 
    EC := TcxGridDBTableView(Sender).Controller.EditingController; 
    if EC.IsEditing then 
     EC.HideEdit(True); 

    S2 := VarToStr(Field.Value); 
    MarkCell := S1 <> S2; 
    if MarkCell then 
     ACanvas.Brush.Color := clLime; 
    end; 
end; 

これを実行するには、TDataSet-descendant型でOldValueプロパティのフィールドの元の内容を正しく返す必要があります。私がこのコードを書いてテストするのに使ったTClientDataSetは確かにこれを行いますが、実際のTDataSetタイプを知りません。

には、FieldName OldValueやValueなどの値が変更されたTFieldのリストを作成するために、これらの2つの手順を使用できます。

+0

変更されたセルから別のセルに移動した場合、変更されたセルは強調表示されません。変更されたかどうかにかかわらず、行内の最後に訪問されたセルのみが強調表示されます。 – user763539

+0

申し訳ありませんが、私はあなたに実装の詳細を残していた。あなたは「変更されたセルを強調表示(または色付け)できる方法はありますか」と尋ねました。私の答えは、OnCloseQueryイベント中に特別にセルを強調表示/色付けする方法を示しています。特定の細胞が特別な治療法の候補ではないかどうかは、あなた次第です。 – MartynA

+0

よろしくお願いします...ありがとうございます。 – user763539

関連する問題