3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(.Net)DataGridView でカスタムクラスバインド時にスタイル設定後ソートすると...

カスタムクラスの List をバインドした DataGridView があります。

セル値を変更してまだDBに保存する前の状態の場合にセルの背景色を変え、保存したら元の背景色に戻すという動作を実現したいと考えてます。

CellValidated イベントや CellValueChanged イベントでセルの背景色を変更しますが、問題がソートしたときです。

今回はカスタムクラスをソートするという特異な要件で、ソートするとデータは並び変わってもセルスタイルはソートされないんですよね。

(カスタムクラスのソートは(.Net)DataGridViewでカスタムクラスをバインドした状態でソートを行う参照)

CellValidatingでの背景色変更はこんな感じです。(C#)

private void dgvParent_CellValueChanged(object sender, DataGridViewCellEventArgs e){

if (mFormLoad) return;

dataGridView1[e.ColumnIndex, e.RowIndex].Style.BackColor = Color.Red;

}

セルの値に基づいてするときは、DataGridView.CellFormattingイベントが使えるのですが、今回はセルの内容ではないのでできません。

(CellFormattingについては、(.Net)バインドされたDataGridViewでソートするとセルの色が元に戻る参照。)

ちなみに、DataGridView に DataTableをバインドした場合は、ソートすると背景色消えるんですよね。

結局、バインドしているカスタムクラスの一意なキーとbool型を持ったグリッドの状態を持つ DataTable を作って、編集があれがグリッド状態保持 DataTable の任意の行をTrueにし、ソート後にループで回してスタイルを変更するというかなり面倒な手法を使うことにしました。。。

もっとスムーズな方法はないものですかね。。?