DataGridViewでセルの一部だけ色を塗りたい

タグの編集
投稿者 .net初心者  (社会人) 投稿日時 2009/10/29 19:38:41
OSはWinXP、VB2008を使用しております。

DataGridViewのセルの背景色を
入ってきた値に応じて青く塗りたいと思っております。

 ※例えば[1/2]という値が入ってくれば、セルの半分だけ青くしたい、
 [3/5]という値が入ってくれば、セルの3/5だけ青くしたいです。

ずっと悩んでおりますが、どうしてもうまくいきません。
どなたかご教授いただけないでしょうか。

また、DataGridViewに限らず何か他に手法がある場合も
どんな些細なことでも構いませんのでお願い致します。
投稿者 るきお  (社会人) 投稿日時 2009/10/29 21:16:44
こんにちは。
通常とは違う方法で表示(描画)を行いたいときは「オーナー描画」と呼ばれる手法を使います。

今回の用件に当てはめるとDataGridViewのCellPaintingイベントを使用することで実現できます。

簡単なサンプルを作ってみましたので参考にしてください。
  
    Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button1.Click

        Dim table As New DataTable
        table.Columns.Add("科目"GetType(String))
        table.Columns.Add("点数"GetType(Integer))

        table.Rows.Add("国語", 80)
        table.Rows.Add("数学", 30)
        table.Rows.Add("英語", 50)

        DataGridView1.DataSource = table


    End Sub

    Private Sub DataGridView1_CellPainting(ByVal sender As System.ObjectByVal e As System.Windows.Forms.DataGridViewCellPaintingEventArgs) Handles DataGridView1.CellPainting

        If e.ColumnIndex = 1 AndAlso e.RowIndex >= 0 Then
            Dim BarRect As Rectangle = e.CellBounds

            BarRect.Width = BarRect.Width * (e.Value / 100)

            e.Graphics.FillRectangle(Brushes.White, e.CellBounds)
            e.Graphics.FillRectangle(Brushes.Red, BarRect)
            e.Graphics.DrawRectangle(Pens.Black, e.CellBounds)
            e.Handled = True

        End If

    End Sub


このサンプルだと枠線の色がちょっとおかしかったり、選択したときに色が変わらなかったりするので
まだちょっと物足りないですが、オーナー描画の手法は組み込まれているのでこれを参考に発展させていけばよいと思います。

実行するにはフォームにDataGridViewとButtonを貼り付けてください。
投稿者 .net初心者  (社会人) 投稿日時 2009/10/29 22:49:43
るきお様 

とても素早い回等ありがとうございます。
教えていただいた通り試したところ、
私のやりたかったことができました!
本当に感謝致します。

申し訳ありませんが、
一点質問よろしいでしょうか。
国語と表示した上に4/5塗りつぶすことは可能でしょうか。
(同セル上に文字と塗りつぶしをしたい場合)

宜しくお願い致します。




投稿者 聖帝  (中学生) 投稿日時 2009/10/30 03:35:57
うむ。
質問ばかりしてるようだが、DataGridViewを作ればいいじゃん。
オリジナルで。そうすりゃ、カスタマも自由自在じゃん。
投稿者 るきお  (社会人) 投稿日時 2009/11/2 02:43:59
こんにちは。


こんな感じです。

>国語と表示した上に4/5塗りつぶすことは可能でしょうか。
>(同セル上に文字と塗りつぶしをしたい場合)


  
Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button1.Click

        Dim table As New DataTable
        table.Columns.Add("科目"GetType(String))
        table.Columns.Add("点数"GetType(Integer))

        table.Rows.Add("国語", 80)
        table.Rows.Add("数学", 30)
        table.Rows.Add("英語", 50)

        DataGridView1.DataSource = table


    End Sub

    Private Sub DataGridView1_CellPainting(ByVal sender As System.ObjectByVal e As System.Windows.Forms.DataGridViewCellPaintingEventArgs) Handles DataGridView1.CellPainting

        If e.ColumnIndex = 0 AndAlso e.RowIndex >= 0 Then
            '点数取得 
            Dim pointColumnValue As Object = DataGridView1.Rows(e.RowIndex).Cells("点数").Value
            Dim point As Integer

            If IsDBNull(pointColumnValue) Then
                Return
            Else
                point = DataGridView1.Rows(e.RowIndex).Cells(1).Value
            End If

            '▼描画 


            '背景描画 
            e.PaintBackground(e.CellBounds, e.State = DataGridViewElementStates.Selected)

            '点数分の赤い棒を描画 
            Dim BarRect As Rectangle = e.CellBounds
            BarRect.Width = BarRect.Width * (point / 100)
            e.Graphics.FillRectangle(Brushes.Red, BarRect)

            '科目名描画 
            e.Graphics.DrawString(e.Value, DataGridView1.Font, Brushes.Black, e.CellBounds)

            '▲ 

            e.Handled = True

        End If

    End Sub


オーナー描画の技法では書きたいものは全部自分で書きます。
この例では「▼描画」から「▲」の部分までが実際に描画している部分で、
この部分にe.Graphicsを使って書いたものが表示されます。

円でも三角でも画像でもe.Graphicsを使って書けば自由にカスタマイズできますので、いろいろ遊んでみてください。