tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルDatagridview の BackColor について
記事No6879
投稿日: 2008/01/23(Wed) 19:39
投稿者AS400からVBへ
VB2005
SQLSERVER EXPRESS

いつも勉強させていただいてます。
上記環境で、データグリッドビューに1000件以上のデータを表示しているのですが、
RowのBackColorを条件に合わせて変更しています。

例)金額が1000円以上はその行を赤色にする 5000円以上は青色 それ以外はデフォルト

データが大量にある場合ループさせると時間がかかってしまいます。
何か良い方法がありましたら教えてください。

テーブルにカラーの値を持っておいて、
バックカラーにバインドできないかやってみましたが無理そうでした。

よろしくお願いします。

[ツリー表示へ]
タイトルRe: Datagridview の BackColor について
記事No6882
投稿日: 2008/01/23(Wed) 22:18
投稿者魔界の仮面弁士
Public Class Form1

    Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) _
    Handles MyBase.Load
        Me.DataGridView1.DataSource = CreateDummyData()
    End Sub

    'チェックボックスの状態によって、セルの色が変化!
    Sub CheckBox1_CheckedChanged(ByVal sender As Object, ByVal e As EventArgs) _
    Handles CheckBox1.CheckedChanged
        Me.DataGridView1.Invalidate()   '再描画を指示
    End Sub

    '★これが本題★
    Sub DataGridView1_CellFormatting(ByVal sender As Object, _
    ByVal e As DataGridViewCellFormattingEventArgs) _
    Handles DataGridView1.CellFormatting
        If Not CheckBox1.Checked Then Return
        Dim c As Color = Me.DataGridView1.DefaultCellStyle.BackColor
        Dim i As Integer
        If Integer.TryParse(e.Value.ToString(), i) Then
            If i >= 5000 Then
                c = Color.Cyan
            ElseIf i >= 1000 Then
                c = Color.Red
            End If
        End If
        e.CellStyle.BackColor = c
    End Sub


    Function CreateDummyData() As DataTable
        CreateDummyData = New DataTable()
        With CreateDummyData
            .Columns.Add("F1", GetType(Integer))
            .Columns.Add("F2", GetType(Integer))
            Dim r As New Random()
            For n As Integer = 1 To 2000
                .Rows.Add(n, r.Next(3000, 10000))
            Next
        End With
    End Function

End Class

[ツリー表示へ]
タイトルRe: Datagridview の BackColor について
記事No6887
投稿日: 2008/01/24(Thu) 11:14
投稿者AS400からVBへ
魔界の仮面弁士さん ありがとうございます。
これでできそうですが、1つのセルごとのイベントですので、
行単位(ROW)で色付けする方法はございますでしょうか?

<データ>

NO  日付    品名
1  2008/01/23 パソコン
2  2008/01/22 キーボード

<条件>

日付が2008/01/23と等しいデータの行
DataGridView1.Rows(RowIndex).DefaultCellStyle.BackColor
の値を指定

    Sub DataGridView1_CellFormatting(ByVal sender As Object, ByVal e As _
    DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting
        Dim c As Color = Me.DataGridView1.RowsDefaultCellStyle.BackColor
        If e.ColumnIndex = 1 And e.Value < Format(Now, "yyyy/MM/dd") Then
            c = Color.Cyan
            Me.DataGridView1.Rows(e.RowIndex).DefaultCellStyle.BackColor = c
        End If
    End Sub

上記方法より、よいプログラミングがありましたら
お手すきの時に教えて頂けると助かります。

[ツリー表示へ]
タイトルRe^2: Datagridview の BackColor について
記事No6888
投稿日: 2008/01/24(Thu) 12:14
投稿者魔界の仮面弁士
> これでできそうですが、1つのセルごとのイベントですので、
問題が発生しているのであれば、具体的に示していただけると。

> 行単位(ROW)で色付けする方法はございますでしょうか?
強いて言えば、RowPrePaint イベントですかね。

> Me.DataGridView1.Rows(e.RowIndex).DefaultCellStyle.BackColor = c
これは微妙。(データ量が少ない時は良いですが…)

個々の行に、むやみに CellStyle を登録していくと、設定情報が増えすぎて
効率が悪いです。異なる行で同じ描画設定になるのであれば、それぞれに
同じ DataGridViewCellStyle インスタンスを使用するようにしてください。

そもそも、値の判定に時間がかからない場合には、CellFormatting の
e.CellStyle に対してセル スタイルを個別に設定した方が、効率は良いかと。


[DataGridView コントロールを拡張するための推奨される手順]
http://msdn2.microsoft.com/ja-jp/library/ha5xt0d9%28VS.80%29.aspx

[ツリー表示へ]