作成日: 2024/11/20 最終更新日: 2024/11/20
文書種別
制限事項
状況
回避方法あり
詳細
ComponentOne 2024J v1(ver.4.8.20241.664)以降では、チェックボックスの外観を、現在の新しいWindows(Windows 10/11)標準のチェックボックスと同じにすることができません。
チェックボックスの外観はC1FlexGrid.IconsStyleプロパティの設定に影響を受け、デフォルトでは旧Windows(Windows 8など)標準のチェックボックスアイコンが表示されます。 これは、FlexGridのチェックボックスのアイコンとして、Windows標準のアイコンではなく新しく365 テーマに追加した独自のアイコンを使用しているためで、仕様上の動作となります。
チェックボックスの外観はC1FlexGrid.IconsStyleプロパティの設定に影響を受け、デフォルトでは旧Windows(Windows 8など)標準のチェックボックスアイコンが表示されます。 これは、FlexGridのチェックボックスのアイコンとして、Windows標準のアイコンではなく新しく365 テーマに追加した独自のアイコンを使用しているためで、仕様上の動作となります。
回避方法
OSに応じてチェックボックスの画像を変更するには、CheckBoxRendererクラスを使って現在のWindowsのチェックボックス画像を動的に生成し、FlexGridのGlyphsプロパティにこの画像を設定します。

◎サンプルコード(VB)
◎サンプルコード(VB)
Imports C1.Win.C1FlexGrid
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim dt = New DataTable()
dt.Columns.Add("bool", GetType(Boolean))
dt.Columns("bool").AllowDBNull = True
Dim i As Integer
For i = 0 To 9
dt.Rows.Add(New Object() {True})
dt.Rows.Add(New Object() {False})
dt.Rows.Add(New Object() {DBNull.Value})
Next
C1FlexGrid1.AutoResize = False
C1FlexGrid1.DataSource = dt
' チェックボックス画像の動的な生成と設定
Dim image1 = New Bitmap(SystemInformation.MenuCheckSize.Width, SystemInformation.MenuCheckSize.Height)
CheckBoxRenderer.DrawCheckBox(Graphics.FromImage(image1), New Point(0, 0), Windows.Forms.VisualStyles.CheckBoxState.CheckedNormal)
Dim image2 = New Bitmap(SystemInformation.MenuCheckSize.Width, SystemInformation.MenuCheckSize.Height)
CheckBoxRenderer.DrawCheckBox(Graphics.FromImage(image2), New Point(0, 0), Windows.Forms.VisualStyles.CheckBoxState.UncheckedNormal)
Dim image3 = New Bitmap(SystemInformation.MenuCheckSize.Width, SystemInformation.MenuCheckSize.Height)
CheckBoxRenderer.DrawCheckBox(Graphics.FromImage(image3), New Point(0, 0), Windows.Forms.VisualStyles.CheckBoxState.MixedNormal)
C1FlexGrid1.Glyphs(GlyphEnum.Checked) = image1
C1FlexGrid1.Glyphs(GlyphEnum.Unchecked) = image2
C1FlexGrid1.Glyphs(GlyphEnum.Grayed) = image3
End Sub
Private Sub C1FlexGrid1_ValidateEdit(sender As Object, e As ValidateEditEventArgs) Handles C1FlexGrid1.ValidateEdit
If Object.ReferenceEquals(C1FlexGrid1.Cols(e.Col).DataType, GetType(Boolean)) Then
e.Cancel = True
If C1FlexGrid1(e.Row, e.Col).Equals(False) Then
C1FlexGrid1(e.Row, e.Col) = True
ElseIf C1FlexGrid1(e.Row, e.Col).Equals(True) Then
C1FlexGrid1(e.Row, e.Col) = DBNull.Value
ElseIf C1FlexGrid1(e.Row, e.Col).Equals(DBNull.Value) Then
C1FlexGrid1(e.Row, e.Col) = False
End If
End If
End Sub
End Class
◎サンプルコード(C#)
using C1.Win.C1FlexGrid;
namespace prj_C1FlexGrid
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
var dt = new DataTable();
dt.Columns.Add("bool",typeof(bool));
dt.Columns["bool"].AllowDBNull = true;
int i;
for(i = 0;i<=9;i++)
{
dt.Rows.Add(new object[] {true});
dt.Rows.Add(new object[] { false });
dt.Rows.Add(new object[] { DBNull.Value });
}
c1FlexGrid1.AutoResize = false;
c1FlexGrid1.DataSource = dt;
c1TrueDBGrid1.DataSource = dt;
// チェックボックス画像の動的な生成と設定
var image1 = new Bitmap(SystemInformation.MenuCheckSize.Width, SystemInformation.MenuCheckSize.Height);
CheckBoxRenderer.DrawCheckBox(Graphics.FromImage(image1), new Point(0, 0), System.Windows.Forms.VisualStyles.CheckBoxState.CheckedNormal);
var image2 = new Bitmap(SystemInformation.MenuCheckSize.Width, SystemInformation.MenuCheckSize.Height);
CheckBoxRenderer.DrawCheckBox(Graphics.FromImage(image2), new Point(0, 0), System.Windows.Forms.VisualStyles.CheckBoxState.UncheckedNormal);
var image3 = new Bitmap(SystemInformation.MenuCheckSize.Width, SystemInformation.MenuCheckSize.Height);
CheckBoxRenderer.DrawCheckBox(Graphics.FromImage(image3), new Point(0, 0), System.Windows.Forms.VisualStyles.CheckBoxState.MixedNormal);
c1FlexGrid1.Glyphs[GlyphEnum.Checked] = image1;
c1FlexGrid1.Glyphs[GlyphEnum.Unchecked] = image2;
c1FlexGrid1.Glyphs[GlyphEnum.Grayed] = image3;
}
private void c1FlexGrid1_ValidateEdit(object sender, ValidateEditEventArgs e)
{
if (object.ReferenceEquals(c1FlexGrid1.Cols[e.Col].DataType, typeof(bool)))
{
e.Cancel = true;
if (c1FlexGrid1[e.Row, e.Col].Equals(false))
{
c1FlexGrid1[e.Row, e.Col] = true;
}
else if (c1FlexGrid1[e.Row, e.Col].Equals(true))
{
c1FlexGrid1[e.Row, e.Col] = DBNull.Value;
}
else if (c1FlexGrid1[e.Row, e.Col].Equals(DBNull.Value))
{
c1FlexGrid1[e.Row, e.Col] = false;
}
}
}
}
}