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

DataGridViewのセル文字色

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

再びDataGridViewのセルスタイルに悩んでいます。
行いたいことは次の処理です。
 1、DBに登録されているFONTCOLORデータをセルの文字色として設定する。 

CellFormattingイベントはあえて使わず、DataSource の設定を行った後に
文字色の設定を行ったのですが、先頭行だけが変わってくれませんでした。


ソースは次のように記述しています。

With dgvSample
 'ヘッダー非表示
  .ColumnHeadersVisible = False
  .AutoGenerateColumns = False
  .DataSource = objDT

  For i As Integer = 0 To .Rows.Count - 1
    Dim objColorCvr As New ColorConverter
    'FONTCOLOR 列のセルの値によって文字色を設定
    .Rows(i).Cells(0).Style.ForeColor = CType(objColorCvr.ConvertFromString(CStr(.Rows(i).Cells("FONTCOLOR").Value)), Color)
    objColorCvr = Nothing
  Next
End With

デバッグをしてみると、先頭行にもセルスタイルは設定していました。
またスタイルの優先順位が関係しているのでしょうか?
ただ、先頭行だけというのがわかりません。


わかる方がいましたら、よろしくお願いします。
■No27040に返信(イデアさんの記事)
> CellFormattingイベントはあえて使わず、
今回のようなケースでは、CellFormattingイベントで動的指定した方が
都合が良いと思いますよ。

> DataSource の設定を行った後に文字色の設定を行ったのですが、
> 先頭行だけが変わってくれませんでした。
ForeColor だけを変更されているようですが、
SelectionForeColor および背景色はどのように設定していますか?

>   For i As Integer = 0 To .Rows.Count - 1
For Each の方が楽かと思います。

>     Dim objColorCvr As New ColorConverter
ループ内で毎回生成しなおす必要は無いはずです。ループ外に出しましょう。

>     'FONTCOLOR 列のセルの値によって文字色を設定
このコードだと、セルの内容によっては色変換できない可能性がありますよ。
(たとえば新規行など)

> またスタイルの優先順位が関係しているのでしょうか?
また、というのが何と比較しての話か見えていないのですが、
優先順位を考慮するのであれば、Style ではなく
InheritedStyle を確認してみてください。


> ただ、先頭行だけというのがわかりません。
とりあえず、DataGridView を貼っただけの環境で試しましたが、
先頭行の色も設定されました。なお、objDT や dgvSample については、
下記のようにしています。

Private objDT As DataTable
Private Sub Form1_Load() Handles MyBase.Load
    objDT = New DataTable("Table1")
    objDT.Columns.Add("Col1")
    objDT.Columns.Add("FONTCOLOR")
    objDT.Rows.Add("100", "Red")
    objDT.Rows.Add("200", "Green")
    objDT.Rows.Add("300", "DarkBlue")
    objDT.Rows.Add("400", "Orange")

    dgvSample.Columns.Clear()
    dgvSample.Columns.Add(New DataGridViewTextBoxColumn() With {.DataPropertyName = "Col1"})
    dgvSample.Columns.Add(New DataGridViewTextBoxColumn() With {.Name = "FONTCOLOR", .DataPropertyName = "FONTCOLOR", .Visible = False})

    With dgvSample
       'イデアさんの No27040 のコード
    End With
End Sub
  • 題名: Re[2]: DataGridViewのセル文字色
  • 著者: イデア
  • 日時: 2010/07/07 13:25:17
  • ID: 27043
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
返信ありがとうございます。


■No27041に返信(魔界の仮面弁士さんの記事)
> ■No27040に返信(イデアさんの記事)
>>CellFormattingイベントはあえて使わず、
> 今回のようなケースでは、CellFormattingイベントで動的指定した方が
> 都合が良いと思いますよ。
最初はCellFormattingイベントで記述したのですが、
スクロールをすると表示行の色がパラパラといった感じで
変わるのが見えたために使うのをやめました。

>>DataSource の設定を行った後に文字色の設定を行ったのですが、
>>先頭行だけが変わってくれませんでした。
> ForeColor だけを変更されているようですが、
> SelectionForeColor および背景色はどのように設定していますか?
まさに失念していました。
今回は表示するだけの単純なもので、
行を追加、更新、削除することもなければ、選択することもなかったために
その可能性を忘れていました。

>>  For i As Integer = 0 To .Rows.Count - 1
> For Each の方が楽かと思います。
> 
>>    Dim objColorCvr As New ColorConverter
> ループ内で毎回生成しなおす必要は無いはずです。ループ外に出しましょう。
> 
>>    'FONTCOLOR 列のセルの値によって文字色を設定
> このコードだと、セルの内容によっては色変換できない可能性がありますよ。
> (たとえば新規行など)
>>またスタイルの優先順位が関係しているのでしょうか?
> また、というのが何と比較しての話か見えていないのですが、
> 優先順位を考慮するのであれば、Style ではなく
> InheritedStyle を確認してみてください。
数々の助言ありがとうございます。
たしかにそうですね…、ソースについては変更を検討します。


魔界の仮面弁士さんの指摘どおり、SelectionForeColor の設定忘れでした。
こんな単純なミスでしたが、わざわざありがとうございます。
無事解決しました。
解決済み!

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