DOBON.NET DOBON.NETプログラミング掲示板過去ログ

DataGridViewのセルスタイルを変更

環境/言語:[VS2008 VB.NET Framework3.0]
分類:[.NET]

現在、VS2008のVB.NETで開発を行っております。

DataGridViewのセルの背景色を変更する処理で行き詰っています。
行いたいことは次の処理です。
 1、DBに登録されているCOLORデータをセルの背景色として初期表示する。
 2、セルをクリックしたらColorDialogにて色を選択し、
   セルの背景色を選択した色に変更する。

こちらのサイトで紹介されていた
【DataGridViewのセルの値によってセルスタイルを変更する】を参考にし、
セルの背景色を初期表示することはできたのですが、
CellEnterイベントにてColorDialogで選択した値を次のように設定しましたが、
色は変わりませんでした。

  Dim dgv As DataGridView = CType(sender, DataGridView)

  If dgv.Columns(e.ColumnIndex).Name = "COLOR" Then
    If ColorDialog.ShowDialog() = DialogResult.OK Then
      dgv.Columns(e.ColumnIndex).DefaultCellStyle.BackColor = ColorDialog.Color
    End If
  End If


色を設定するプロパティが間違っているのでしょうか?
わかる方がいましたら、よろしくお願いします。
ためしてみました

FormにDataGridViewとColorDialogだけ
プロパティとか全てデフォルト

DataGridViewに列を2つ追加
2つめのNameを「COLOR」にして

CellEnterにコード貼り付けて実行

色変わってますね
ただしセルが選択された状態だと選択色になってるので
他のセルを選択すれば確認できました
■No26809に返信(くらさんの記事)
> ためしてみました
> 
> FormにDataGridViewとColorDialogだけ
> プロパティとか全てデフォルト
> 
> DataGridViewに列を2つ追加
> 2つめのNameを「COLOR」にして
> 
> CellEnterにコード貼り付けて実行
> 
> 色変わってますね
> ただしセルが選択された状態だと選択色になってるので
> 他のセルを選択すれば確認できました
> 
> 

返信ありがとうございます。

何もスタイルを設定していない列で私も試しましたが、
選択した列全ての色が変わってしまいました。
くらさんは選択したセルだけが変わっているんですよね?
何が違うのでしょうか?


私が実現して欲しい列は相変わらず色が変わってくれません。
もう少し情報を補足しますので、試していただければ幸いです。

DataGridViewの「COLOR」列は、選択した状態でも色がわかるように
SelectionBackColorプロパティをTransparentに設定しています。

色の初期設定をCellFormattingイベントで行っています。
   Dim dgv As DataGridView = CType(sender, DataGridView)

   'セルの列を確認
   If dgv.Columns(e.ColumnIndex).Name = "COLOR" Then
       Dim objColorCvr As New ColorConverter

       'COLORVALUE 列のセルの値によって背景色を決定する
       e.CellStyle.BackColor = objColorCvr.ConvertFromString(CStr(dgv("COLORVALUE", e.RowIndex).Value))

       objColorCvr = Nothing
   End If


以上です。よろしくお願いします。
>くらさんは選択したセルだけが変わっているんですよね?
1.列ではなくセルのみ背景色を変更したい?

>私が実現して欲しい列は相変わらず色が変わってくれません。
2.CellEnterイベントが発生した列ではない列の背景色を変えたい?

文章が曖昧なのではっきりいたしませんが
1.なら
>dgv.Columns(e.ColumnIndex).DefaultCellStyle.BackColor = ColorDialog.Color

dgv.Rows(e.RowIndex).Cells(e.ColumnIndex).Style.BackColor = colordialog.Color
にすればセルのみ背景色を変更

2.なら
e.ColumnIndexを背景色を変更したい列番号にする

あとOption Strict Onにしましょう
返信ありがとうございます。

> あとOption Strict Onにしましょう
すみません。久しぶりのプログラミングなので、
そのあたりの設定をすっかり忘れていました。

> 1.列ではなくセルのみ背景色を変更したい?
最初で述べたように、セルの背景色を変更したいのです。
紛らわしい言い方になってしまったようですみません。


私が最初に設定した
dgv.Columns(e.ColumnIndex).DefaultCellStyle.BackColor 
では、そもそもセルの背景色を変更するものではなかったのですね…。

くらさんに教えていただいた方法にプラスして、セルが選択されたときに表示される背景色も設定してみました。

'--- セルが選択されたときの背景色 ---
dgv.Rows(e.RowIndex).Cells(e.ColumnIndex).Style.SelectionBackColor = colordialog.Color
'--- セルの背景色 ---
dgv.Rows(e.RowIndex).Cells(e.ColumnIndex).Style.BackColor = colordialog.Color

セルの色が変更できました!!


次にColorDialogを表示時にセルの背景色を初期選択するように

dgv.Rows(e.RowIndex).Cells(e.ColumnIndex).Style.BackColor

にて色を取得しようとしましたが、値は入っていませんでした。
(一度でも選択すると入っているのですが…)

そこで、CellFormattingイベントでの色の設定を
次のように変更しました。

dgv.Rows(e.RowIndex).Cells(e.ColumnIndex).Style.BackColor = CType(objColorCvr.ConvertFromString(CStr(dgv("COLORVALUE", e.RowIndex).Value)), Color)

ColorDialogの初期値を設定することができました。

このやり方がベストなのかは不安ではありますが、
一応実現したい動作は確認することができました。

ここまでお付き合いいただいた くらさん、本当にありがとうございました。
まだ解決済みマークは付いていないのようなので、追加情報として:

■No26820に返信(イデアさんの記事)
>(一度でも選択すると入っているのですが…)

スタイルが未設定の時に Style プロパティの値を取得すると、そのタイミングで
新しい DataGridViewCellStyle が自動的に生成されます。不用意な作成を
防ぐために、HasStyle/HasDefaultCellStyle を併用してください。


> dgv.Rows(e.RowIndex).Cells(e.ColumnIndex).Style.BackColor
> にて色を取得しようとしましたが、値は入っていませんでした。

Style と InheritedStyle の違いにも注意して下さい。

そもそもスタイル設定は、複数の箇所で定義できます。

そして、個々のセルのスタイルが未設定のままの場合(HasStyle = False)、
その上位要素(たとえば「行」)の基準スタイルで描画される事になります。

また、たとえスタイルが設定されていても、前景色、背景色、フォント等の
個々の項目が未設定の場合(Font なら Nothing、色なら Color.Empty)、
その項目部分だけ、上位要素の値が使われます。

下記に、スタイルを指定するためのプロパティを列挙しておきます。
これらのスタイルの優先順位は、下記資料の中程にある図を参照のこと。
http://msdn.microsoft.com/ja-jp/library/1yef90x0%28VS.80%29.aspx

 ・DataGridView 全体 : DefaultCellStyle
 ・すべての列ヘッダ : ColumnHeadersDefaultCellStyle
 ・すべての行ヘッダ : RowHeadersDefaultCellStyle
 ・すべての行 : RowsDefaultCellStyle
 ・すべての奇数行 : AlternatingRowsDefaultCellStyle
 ・特定の行 : 行の DefaultCellStyle
 ・特定の列 : 列の DefaultCellStyle
 ・特定のセル : セルの Style

また、CellFormatting イベントを用いて、一時的に別のスタイル設定で
描画させる事もできます。

データの並び変えを行ったりすると、セルの色がリセットされる事に
なりますので、セルの内容に応じて色を変えたりする場合には、
セル単位でスタイルを指定するよりも、イベントを通じて指定した方が、
都合が良い場合もあります。適宜使い分けてみて下さい。


> dgv.Rows(e.RowIndex).Cells(e.ColumnIndex).Style.BackColor =
dgv.Rows(y).Cells(x).Style ではなく、dgv(x, y).Style を使ってください。
その方がパフォーマンスが良くなります。
http://msdn.microsoft.com/ja-jp/library/ha5xt0d9%28VS.85%29.aspx
魔界の仮面弁士さん。
細やかで丁寧な解説、大変勉強になりました。

スタイルの設定だけで、それだけの種類があるのですね。
試しながら使い分けたいと思います。


>>dgv.Rows(e.RowIndex).Cells(e.ColumnIndex).Style.BackColor =
> dgv.Rows(y).Cells(x).Style ではなく、dgv(x, y).Style を使ってください。
> その方がパフォーマンスが良くなります。
> http://msdn.microsoft.com/ja-jp/library/ha5xt0d9%28VS.85%29.aspx

なかなかパフォーマンスの方まで気が回りませんでした…。
イベントの実行頻度を考えると、パフォーマンスって結構重要ですよね。
早速変更させていただきました。

ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板