- PR -

DataGridセル位置指定の色替

1
投稿者投稿内容
ヤクルト400
会議室デビュー日: 2004/02/16
投稿数: 18
投稿日時: 2004-03-02 12:26
WindowsアプリケーションでDataGridを使用していますが、
特定のセルをその値によらず色替する方法はないでしょうか?
(何行目・何列目のセルという指定で色替したいのですが。)

過去の例を調べたところ、Paintメソッドの呼出しを改造して(GridStyleTextBoxColumnの
拡張)、○○という値がセルに入っていたら○色にするといったような例しかありませんでした。
標準のDataGridでは位置指定での色替えはできないのでしょうか・・・?

よろしくお願いします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-03-02 13:18
引用:

ヤクルト400さんの書き込み (2004-03-02 12:26) より:

過去の例を調べたところ、Paintメソッドの呼出しを改造して(GridStyleTextBoxColumnの
拡張)、○○という値がセルに入っていたら○色にするといったような例しかありませんでした。
標準のDataGridでは位置指定での色替えはできないのでしょうか・・・?


 そこまでわかったら、私なら「では、Paintメソッドで、今から描画しようとしているセルの位置はどこかがわかるか」ということを調べるのですが、そういうパラメータはない?

・・・ちょっと調べる・・・

 イベント引数に今から描画するRectangleが入っているので、DataGridのGetCellBoundsから取ってきたRectangleと座標比較することで、何とかなると思います。
ヤクルト400
会議室デビュー日: 2004/02/16
投稿数: 18
投稿日時: 2004-03-03 10:01
いつもご回答ありがとうございます。

引用:

Jittaさんの書き込み (2004-03-02 13:18) より:
 イベント引数に今から描画するRectangleが入っているので、DataGridのGetCellBoundsから取ってきたRectangleと座標比較することで、何とかなると思います。



やってみようとしたんですが、よく考えるとPaintメソッドって自分で呼び出しているわけではないので、
(DataGridを再描画する必要があるときに自動でイベント発生して呼出してるんですよね?)
どこでどう処理したらよいのかが分からないんですが・・・

座標比較する処理って、Paintメソッドに追加するのだと思うんですが、
色指定したいセルの座標をPaintメソッドのイベント引数に追加するってことでしょうか?
(この時点でやり方がちょっとわからないんですが、解釈がまちがってますか・・・?)
さらにそれができたとして、それをどうやって呼出したらよいのでしょうか?

最初の投稿の時に「Paintメソッドの呼出しを改造して・・・」と書いていますので、誤解させてしまったかと
思いますが、正確には
「自動で呼出されているPaintメソッドに、セルの値によって塗りつぶしの色を変更する処理を加えて、Mybase.Paintを呼出している」
なので、画面の方からPaintメソッドを呼出してはいないのです。
(イベントとしてDataGrid.Paintはありますが、当然ながらこのイベントは勝手に発生しています。イベントのDataGrid.Paintに座標比較処理を追加しようと考えても、この時点では、今から描画するRectangleが分かりません。)

うまく書けないですが、つまり、ちんぷんかんぷん状態なのです・・・(TT)
どこにどのような処理を書けばよいのかを、ご指導いただけたらうれしいです。
よろしくお願いします。

Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-03-03 11:22
 セル1つ1つについて発生すると思っていたのですが、グリッド全体で発生するようですね。

 でも、DataGridの各セルは、何らかのコントロールのはずですから、それらについてもPaintイベントが発行されるはずです。…と調べてみると、DataGridTextBoxクラスというのがありますね。これもControlsから派生しているのでPaintイベントがあります。ということは、

  1. 色を変えたいセルがどのコントロールで描画されているのかを調べ、
  2. そのセルを描画するコントロールを取得し、
  3. イベントハンドラを登録すれば、

実現できそうです。

*BBコードの誤り訂正

[ メッセージ編集済み 編集者: Jitta 編集日時 2004-03-03 11:23 ]
ヤクルト400
会議室デビュー日: 2004/02/16
投稿数: 18
投稿日時: 2004-03-04 21:22
引用:

Jittaさんの書き込み (2004-03-03 11:22) より:
 セル1つ1つについて発生すると思っていたのですが、グリッド全体で発生するようですね。

 でも、DataGridの各セルは、何らかのコントロールのはずですから、それらについてもPaintイベントが発行されるはずです。…と調べてみると、DataGridTextBoxクラスというのがありますね。これもControlsから派生しているのでPaintイベントがあります。ということは、

[*]色を変えたいセルがどのコントロールで描画されているのかを調べ、
[*]そのセルを描画するコントロールを取得し、
[*]イベントハンドラを登録すれば、

実現できそうです。


ヤクルト400です。
Jittaさんのご指摘から試行錯誤を繰返した結果、先ほど実現できました。

ちょっとショックなことに実現後に発見したのですが、すでにこちらの会議室で話題に
のぼっていて、しかも解決しているようでした。
↓↓↓↓↓
件名:DataGridの特定セルの背景色の変更方法について
投稿日付:2003/11/19
(リンクの仕方がわかりません・・・勝手にURL貼付けていいのでしょうか?いいんですよね?貼付けます)
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?forum=7&topic=7547

上記ではDataGridTextBoxColumnクラスを継承した派生クラスのPaintメソッドをオーバーライドし、
そこにセルの色替処理を直接追加してMybase.Paintを呼出しているようですが、私の方法は、
似ていますが少し異なりますので、下記にご報告します。
(Jittaさんの云わんとしていたのも、下記のやりかたではないでしょうか?)

@DataGridTextBoxColumnクラスを継承した派生クラスのPaintメソッドをオーバーライドするのは同じ
Aオーバーライドしているなかで、直接色替の処理を書かずに自分で定義したイベントを呼出す(RaiseEvent)。このときパラメータとして、Paintメソッドで使用するもののうち、
bounds As Rectangle,backBrush As Brush,foreBrush As Brush
を渡すようにする
BDataGridのTableStyleに@のDataGridTextBoxClumn派生クラスを追加する時に、Aのイベントを登録する(AddHandler)
CDataGridがあるソースファイルにBで登録したイベント関数の中身を記述し、そこでセルの色替条件を作成する(Aのboundsと色替えしたい○列目○行目セルのRectangleが同じだったら、backBrushを変更するなど)
D色替したいときには、DataGridのRefleshメソッドで、Cが勝手に呼出される

です。
最大でDataGridに表示するセル数分の色替セル情報をCの処理のために保持しなければならないのが、ちょっと難点ですが、この方法であれば、今回の実現したい仕様である
@色の種類が複数必要
A使用する色を変更する可能性が高いので一括にまとめておきたい
(エラー色など、DataGrid以外のコントロールにも使用している)
BDataGridのセルAの内容によって、別のセルBを色替したい
が何とかなりそうです。

Jittaさん、ありがとうございました。
Os_
ベテラン
会議室デビュー日: 2003/04/16
投稿数: 77
投稿日時: 2004-03-05 09:52
おさです。
引用:

ヤクルト400さんの書き込み (2004-03-04 21:22) より:
Aオーバーライドしているなかで、直接色替の処理を書かずに自分で定義したイベントを呼出す(RaiseEvent)。このときパラメータとして、Paintメソッドで使用するもののうち、
bounds As Rectangle,backBrush As Brush,foreBrush As Brush
を渡すようにする
BDataGridのTableStyleに@のDataGridTextBoxClumn派生クラスを追加する時に、Aのイベントを登録する(AddHandler)
CDataGridがあるソースファイルにBで登録したイベント関数の中身を記述し、そこでセルの色替条件を作成する(Aのboundsと色替えしたい○列目○行目セルのRectangleが同じだったら、backBrushを変更するなど)


解決した後ですが、
イベントで渡す項目に以下の項目を追加する方法もあります。

・rowNum    :Paint引数の行番号
・MappingName:DataGridTextBoxのMappingName
・Object    :Paint引数の CurrencyManager から CurrencyManager.List[rowNum]で取得

ちなみに元データがDataTable、DataViewであればObjectはDataRowViewになります。

これにより、該当するセルの行番号、列名、該当レコードデータを渡すことができ、
同一レコードの別のセルの値参照も可能になり
より汎用的な派生クラスの定義が可能かと思います。
ヤクルト400
会議室デビュー日: 2004/02/16
投稿数: 18
投稿日時: 2004-03-05 13:16
引用:

Os_さんの書き込み (2004-03-05 09:52) より:
おさです。
イベントで渡す項目に以下の項目を追加する方法もあります。

・rowNum    :Paint引数の行番号
・MappingName:DataGridTextBoxのMappingName
・Object    :Paint引数の CurrencyManager から CurrencyManager.List[rowNum]で取得

これにより、該当するセルの行番号、列名、該当レコードデータを渡すことができ、
同一レコードの別のセルの値参照も可能になり
より汎用的な派生クラスの定義が可能かと思います。




なるほど!
MappingNameはペイントメソッドと関係なく、DataGridTextBoxColumnのプロパティということですね?

Os_さん、ありがとうございます。
1

スキルアップ/キャリアアップ(JOB@IT)