Copyright © GrapeCity inc. All rights reserved.
True DBGrid for WinForms
独自の条件に基づいてセルのスタイルを適用する
スタイルの使用方法 > セルにスタイルを適用する > 独自の条件に基づいてセルのスタイルを適用する

正規表現が目的の書式設定の表現に適さない場合は、FetchCellStyle イベントを使用して、フォントおよび色をセル単位でカスタマイズできます。このイベントは、列の FetchStyle プロパティが True に設定されている場合にだけ発生します。

たとえば、ある範囲内の値に、コード内で色を指定するとします。次のコードは、数値データを含むある列の FetchStyle プロパティが True であることを前提としています。このコードは、FetchCellStyle イベントを処理し、1000 より大きな値を青色で表示します。

Visual Basic コードの書き方

Visual Basic
コードのコピー
Private Sub C1TrueDBGrid1_FetchCellStyle(ByVal sender As Object, ByVal e As C1.Win.C1TrueDBGrid.FetchCellStyleEventArgs) Handles C1TrueDBGrid1.FetchCellSTyle
    Dim N As Integer
    N = Val(Me.C1TrueDBGrid1(e.Row, e.Col)
    If N > 1000 Then 
        e.CellStyle.ForeColor = System.Drawing.Color.Blue
    End If
End Sub

C# コードの書き方

C#
コードのコピー
private void c1TrueDBGrid1_FetchCellStyle( object sender,  C1.Win.C1TrueDBGrid.FetchCellStyleEventArgs e)
{
    int N;
    N = (int) this.c1TrueDBGrid1[e.Row, e.Col]; 
    if ( N > 1000 ) 
    {
        e.CellStyle.ForeColor = System.Drawing.Color.Blue;
    }
}

Split, Row, Colの各引数で、グリッドに表示するセルを指定します。CellStyle引数によって、書式設定の情報がアプリケーションからグリッドに伝達されます。CellStyle 引数は  Style オブジェクトなので、次のように、セルのフォントの特性を FetchCellStyle イベントで変更することもできます。

Visual Basic コードの書き方

Visual Basic
コードのコピー
If N > 1000 Then 
    e.CellStyle.Font.Italic = True 
Dim myfont As Font
myfont = New Font (e.CellStyle.Font, FontStyle.Italic)
If N > 1000 Then 
    e.CellStyle.Font = myfont

C# コードの書き方

C#
コードのコピー
if ( N > 1000 ) 
{
    e.CellStyle.Font.Italic = true 
}
Font myfont;
myfont = new Font (e.CellStyle.Font, FontStyle.Italic);
if ( N > 1000 ) 
{
    e.CellStyle.Font = myfont;
}

if ( N > 1000 ) e.CellStyle.Font = myfont;また、FetchCellStyle イベントを使用して、他のセルの値や他のコントロールによって、書式設定をセルに適用することもできます。たとえば、次のように設定するとします。

この場合は、列4および列7の FetchStyle プロパティを True に設定し、FetchCellStyle イベントを次のように処理します。

Visual Basic コードの書き方

Visual Basic
コードのコピー
Private Sub C1TrueDBGrid1_FetchCellStyle(ByVal sender As Object, ByVal e As C1.Win.C1TrueDBGrid.FetchCellStyleEventArgs) Handles C1TrueDBGrid1.FetchCellStyle
    Select Case e.Col
        Case 4
            Dim Col1 As Long, Col2 As Long
            Col1 = CLng(Me.C1TrueDBGrid1(e.Row, 1))
            Col2 = CLng(Me.C1TrueDBGrid1(e.Row, 2))
            If Col1 - Col2 < 0 Then 
                CellStyle.ForeColor = System.Drawing.Color.Red
        Case 7
            Dim S As String
            S = Me.C1TrueDBGrid1(e.Row, 7).ToString()
            If S = TextBox1.Text Then 
                 Dim myfont = New Font(CellStyle.Font, FontStyle.Bold)
                 CellStyle.Font = myfont
            End If
        Case Else
            Debug.WriteLine ("FetchCellStyle not handled: " & e.Col)
    End Select
End Sub

C# コードの書き方

C#
コードのコピー
private void c1TrueDBGrid1_FetchCellStyle( object sender,  C1.Win.C1TrueDBGrid.FetchCellStyleEventArgs e)
{
    switch (e.Col) 
    {
        case 4:
            long Col1, long Col2;
            Col1 = (long)this.c1TrueDBGrid1[e.Row, 1];
            Col2 = (long)this.c1TrueDBGrid1[e.Row, 2];
            if ( Col1 - Col2 < 0 ) 
                CellStyle.ForeColor = System.Drawing.Color.Red
                break;
        case 7:
            string  S;
            S = this.c1TrueDBGrid1[e.Row, 7].ToString();
            if ( S == TextBox1.Text ) 
            { 
                Font  myfont = new Font(CellStyle.Font, FontStyle.Bold);
                CellStyle.Font = myfont;
            }
                   break;
        default:
            Console.WriteLine ("FetchCellStyle not handled: " + e.Col);
    }
}

効率を高めるには、FetchCellStyle イベントで処理する列の FetchStyle だけを True に設定する必要があります。

メモ:前述の例では、CellText メソッドを使用して、コードを単純化しています。ただし、CellText メソッドおよび CellValue メソッドは、呼び出されるたびに、データセットの内部クローンを作成および破棄します。そのため、これらのメソッドは非効率的になり、FetchCellStyle イベントで使用できないことがあります。グリッドの表示サイクルのパフォーマンスを向上させるには、非連結アプリケーションを使用してみてください。非連結アプリケーションを使用すると、基礎データソースに直接アクセスできるため、CellText または CellValue を呼び出す場合に比べて、通常、処理が高速になります。

フォントおよび色を、セル単位ではなく行単位でカスタマイズするには、FetchRowStyle イベントを使用します。このイベントは、FetchRowStyles プロパティが True に設定されているグリッド内の列ごとに、一度だけ発生します。このイベントの構文は次のとおりです。

Visual Basic コードの書き方

Visual Basic
コードのコピー
Private Sub TDBGrid1_FetchRowStyle(ByVal sender As Object, ByVal e As C1.Win.C1TrueDBGrid.FetchRowStyleEventArgs) Handles C1TrueDBGrid1.FetchRowStyle

C# コードの書き方

C#
コードのコピー
private void TDBGrid1_FetchRowStyle( object sender, C1.Win.C1TrueDBGrid.FetchRowStyleEventArgs e)

FetchRowStyle イベントを使って1行ごとに行の色を互い違いにすることもできますが、AlternatingRows プロパティと組み込みの EvenRow スタイルおよび OddRow スタイルを使用すると、より簡単で効率よく同じタスクを実行できます。

関連トピック