作成日: 2023/09/04 最終更新日: 2025/05/07
文書種別
使用方法
詳細
1行おきの背景色を設定するためのAlternateスタイルは、すべての行が表示されていることを前提としているため、フィルタ操作によって非表示行ができた場合、背景色が交互に表示されない場合があります(詳しくは、末尾のメモ※をご参照ください)。
この動作を避け、フィルタ設定後にも1行おきの背景色を維持するようにするには、Alternateスタイルを使用せず、AfterFilterイベントとOwnerDrawCellイベントを用いて独自にスタイルを設定します。
まずAfterFilterイベントで、フィルタリング後に表示されている行番号を取得します。
次いでOwnerDrawCellイベントで、オーナー描画機能を使って1行おきに表示行の背景色を設定します。
以下に、簡単な設定例を記載します。

◎サンプルコード(VB)
※【メモ】
FlexGridは、ActiveXのMSFlexGrid(*1)を起源とするグリッドコントロールであり、あらゆるデータソースとバインドして、あるいはバインドせずに直接各セルに値を代入することによって、グリッド形式でデータを表示することを目的としています。そのため、数式に基づく編集や集計、テーブル化などを行う、いわゆる表計算コントロール(*2)とはコンセプトが異なっています。
*1:Visual Basic 6.0などの環境で使われたMicrosoft社のActiveXコントロールで、データ表示に特化
*2:MS Excel、SPREAD for Windows Formsなど
FlexGridにおける組み込みのスタイルは、グリッド全体に対して適用されるものとなります。そのため、Alternateスタイルについては、表示上の偶数行ではなく、あくまでもグリッド上のデータに基づく偶数行である点にご留意ください。
また、FlexGridにおけるフィルタリング機能は、抽出条件に該当しない行のVisibleプロパティをfalseにすることで実現しています。これは、データソースの形式に関わらず一貫した処理が提供できることと、カスタムフィルタリングを実装する上で制御しやすいことを意図したものとなります。
その結果、フィルタリングを実行することによって一部の行が非表示になりますが、それは表示上におけるものでありグリッドデータ自体は保持したままであるため、フィルタリングの適用状況によっては、Alternateスタイルが不規則に適用されたように見える場合があります。
そのため回避策としては、表示上の各行の行インデックスを取得した上で、その偶数行のスタイルを変更する必要があります。
(更新履歴)
2025/05/07
【メモ】を追記
この動作を避け、フィルタ設定後にも1行おきの背景色を維持するようにするには、Alternateスタイルを使用せず、AfterFilterイベントとOwnerDrawCellイベントを用いて独自にスタイルを設定します。
まずAfterFilterイベントで、フィルタリング後に表示されている行番号を取得します。
次いでOwnerDrawCellイベントで、オーナー描画機能を使って1行おきに表示行の背景色を設定します。
以下に、簡単な設定例を記載します。
◎サンプルコード(VB)
Imports C1.Win.C1FlexGrid
Public Class Form1
Private visibleRows As New ArrayList()
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' データ設定
For i = C1FlexGrid1.Rows.Fixed To C1FlexGrid1.Rows.Count - 1
C1FlexGrid1.Item(i, 1) = i Mod 3
C1FlexGrid1.Item(i, 2) = $"B{i}"
Next
C1FlexGrid1.AllowFiltering = True
'' test : Alternateの設定
'C1FlexGrid1.Styles.Alternate.BackColor = Color.LightGreen
' オーナー描画を使った交互行スタイル設定[1/3]
C1FlexGrid1.DrawMode = DrawModeEnum.OwnerDraw
Dim cs = C1FlexGrid1.Styles.Add("CustomAlternateStyle")
cs.BackColor = Color.LightGreen
End Sub
Private Sub C1FlexGrid1_AfterFilter(sender As Object, e As EventArgs) Handles C1FlexGrid1.AfterFilter
visibleRows.Clear()
' 表示されている行番号の取得
For i = C1FlexGrid1.Rows.Fixed To C1FlexGrid1.Rows.Count - 1
If C1FlexGrid1.Rows(i).IsVisible Then
visibleRows.Add(i)
End If
Next
End Sub
Private Sub C1FlexGrid1_OwnerDrawCell(sender As Object, e As OwnerDrawCellEventArgs) Handles C1FlexGrid1.OwnerDrawCell
' オーナー描画を使った交互行スタイル設定
If e.Row >= C1FlexGrid1.Rows.Fixed AndAlso visibleRows.IndexOf(e.Row) Mod 2 = 0 Then
e.Style = C1FlexGrid1.Styles("CustomAlternateStyle")
End If
End Sub
End Class
◎サンプルコード(C#)
using System.Collections;
using C1.Win.C1FlexGrid;
namespace prj_C1FlexGrid
{
public partial class Form1 : Form
{
ArrayList visibleRows = new ArrayList();
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
// データ設定
for (int i = c1FlexGrid1.Rows.Fixed; (i<= (c1FlexGrid1.Rows.Count - 1)); i++)
{
c1FlexGrid1[i, 1] = i % 3;
c1FlexGrid1[i, 2] = $"B{i}";
}
c1FlexGrid1.AllowFiltering = true;
////test : Alternateの設定
//c1FlexGrid1.Styles.Alternate.BackColor = Color.LightGreen;
// オーナー描画の使用
c1FlexGrid1.DrawMode = DrawModeEnum.OwnerDraw;
// 1行おきの背景色スタイルを定義
CellStyle cs = c1FlexGrid1.Styles.Add("CustomAlternateStyle");
cs.BackColor = Color.LightGreen;
}
private void c1FlexGrid1_AfterFilter(object sender, EventArgs e)
{
visibleRows.Clear();
// 表示されている行番号の取得
for (int i = c1FlexGrid1.Rows.Fixed; i<= (c1FlexGrid1.Rows.Count - 1); i++)
{
if (c1FlexGrid1.Rows[i].IsVisible)
{
visibleRows.Add(i);
}
}
}
private void c1FlexGrid1_OwnerDrawCell(object sender, OwnerDrawCellEventArgs e)
{
// オーナー描画を使った交互行スタイル設定
if (((e.Row >= c1FlexGrid1.Rows.Fixed) && ((visibleRows.IndexOf(e.Row) % 2) == 0)))
{
e.Style = c1FlexGrid1.Styles["CustomAlternateStyle"];
}
}
}
}
※【メモ】
FlexGridは、ActiveXのMSFlexGrid(*1)を起源とするグリッドコントロールであり、あらゆるデータソースとバインドして、あるいはバインドせずに直接各セルに値を代入することによって、グリッド形式でデータを表示することを目的としています。そのため、数式に基づく編集や集計、テーブル化などを行う、いわゆる表計算コントロール(*2)とはコンセプトが異なっています。
*1:Visual Basic 6.0などの環境で使われたMicrosoft社のActiveXコントロールで、データ表示に特化
*2:MS Excel、SPREAD for Windows Formsなど
FlexGridにおける組み込みのスタイルは、グリッド全体に対して適用されるものとなります。そのため、Alternateスタイルについては、表示上の偶数行ではなく、あくまでもグリッド上のデータに基づく偶数行である点にご留意ください。
また、FlexGridにおけるフィルタリング機能は、抽出条件に該当しない行のVisibleプロパティをfalseにすることで実現しています。これは、データソースの形式に関わらず一貫した処理が提供できることと、カスタムフィルタリングを実装する上で制御しやすいことを意図したものとなります。
その結果、フィルタリングを実行することによって一部の行が非表示になりますが、それは表示上におけるものでありグリッドデータ自体は保持したままであるため、フィルタリングの適用状況によっては、Alternateスタイルが不規則に適用されたように見える場合があります。
そのため回避策としては、表示上の各行の行インデックスを取得した上で、その偶数行のスタイルを変更する必要があります。
(更新履歴)
2025/05/07
【メモ】を追記