作成日: 2024/05/24 最終更新日: 2025/06/12
文書種別
不具合
状況
回避方法あり
詳細
DrawModeをOwnerDrawにし、OwnerDrawCellイベントでカレント行の塗りつぶしを行った場合、画面をスクロールすると一部の行が欠ける(描画されない)現象が発生します。
※マウスホイールでのスクロールで発生しやすいようです。

(2024/05/29 更新)
列のスタイルではなく、セルの値を設定した場合でも同様の現象が発生します。
※マウスホイールでのスクロールで発生しやすいようです。
(2024/05/29 更新)
列のスタイルではなく、セルの値を設定した場合でも同様の現象が発生します。
回避方法
本現象を回避するには、AfterScrollイベント内でInvalidateメソッドを実行し、コントロールを強制的に再描画します。
※下記コードは.NET 8プロジェクトの例です。
◎サンプルコード(VB)
※下記コードは.NET 8プロジェクトの例です。
◎サンプルコード(VB)
Imports C1.Win.FlexGrid
Imports System.Drawing
Public Class Form1
Public Sub New()
InitializeComponent()
' データ設定
AddHandler Me.Load, AddressOf DrawMode_Load
AddHandler C1FlexGrid1.OwnerDrawCell, AddressOf C1FlexGrid1_OwnerDrawCell
AddHandler C1FlexGrid1.AfterScroll, AddressOf C1FlexGrid1_AfterScroll
End Sub
Private Sub DrawMode_Load(sender As Object, e As EventArgs)
C1FlexGrid1.Cols.Count = 6
Dim colNames As String() = {"", "ColumnA", "ColumnB", "ColumnC", "ColumnD", "ColumnE"}
For i As Integer = 1 To colNames.Length - 1
C1FlexGrid1.Cols(i).Name = colNames(i)
C1FlexGrid1.Cols(i).Caption = colNames(i)
Next
C1FlexGrid1.Rows.Count = 2000
' 描画方式を設定
C1FlexGrid1.DrawMode = DrawModeEnum.OwnerDraw
' フォーカス時のスタイル設定
C1FlexGrid1.Styles.Add("GreenStyle")
C1FlexGrid1.Styles("GreenStyle").BackColor = Color.FromArgb(192, 255, 192)
End Sub
' OwnerDrawCell イベントの処理
Private Sub C1FlexGrid1_OwnerDrawCell(sender As Object, e As OwnerDrawCellEventArgs)
If C1FlexGrid1.Row 0 Then
If e.Row = C1FlexGrid1.Row Then
' 選択行にスタイルを適用
C1FlexGrid1.Rows(e.Row).Style = C1FlexGrid1.Styles("GreenStyle")
Else
' その他の行にデフォルトまたは別のスタイルを適用
C1FlexGrid1.Rows(e.Row).Style = C1FlexGrid1.Styles("FirstCustomStyle")
End If
End If
End Sub
' AfterScroll イベント:スクロール時に描画を更新
Private Sub C1FlexGrid1_AfterScroll(sender As Object, e As RangeEventArgs)
C1FlexGrid1.Invalidate()
End Sub
End Class
◎サンプルコード(C#)
using C1.Win.FlexGrid;
namespace prj_OwnerDrawScroll
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// データ設定
this.Load += DrawMode_Load;
c1FlexGrid1.OwnerDrawCell += C1FlexGrid1_OwnerDrawCell;
c1FlexGrid1.AfterScroll += C1FlexGrid1_AfterScroll;
}
private void DrawMode_Load(object sender, EventArgs e)
{
c1FlexGrid1.Cols.Count = 6;
string[] colNames = { "", "ColumnA", "ColumnB", "ColumnC", "ColumnD", "ColumnE" };
for (int i = 1; i < colNames.Length; i++)
{
c1FlexGrid1.Cols[i].Name = colNames[i];
c1FlexGrid1.Cols[i].Caption = colNames[i];
}
c1FlexGrid1.Rows.Count = 2000;
// 描画方式を設定
c1FlexGrid1.DrawMode = C1.Win.FlexGrid.DrawModeEnum.OwnerDraw;
// SetCellStyleメソッドでフォーカス時スタイルの登録
c1FlexGrid1.Styles.Add("GreenStyle");
c1FlexGrid1.Styles["GreenStyle"].BackColor = Color.FromArgb(192, 255, 192);
}
// OwnerDrawCellイベントの処理
private void C1FlexGrid1_OwnerDrawCell(object sender, OwnerDrawCellEventArgs e)
{
if (c1FlexGrid1.Row > 0)
{
if (e.Row == c1FlexGrid1.Row)
{
// 現在選択中の行に、DrawMode_Load で設定したスタイルを適用
c1FlexGrid1.Rows[e.Row].Style = c1FlexGrid1.Styles["GreenStyle"];
}
else
{
// 選択していない行に、初期設定のスタイルを適用
c1FlexGrid1.Rows[e.Row].Style = c1FlexGrid1.Styles["FirstCustomStyle"];
}
}
}
// AfterScroll イベント:スクロール時に描画を更新
private void C1FlexGrid1_AfterScroll(object sender, RangeEventArgs e)
{
c1FlexGrid1.Invalidate();
}
}
}