[C#] CheckedListBoxで1つだけ選択を許可する方法
C#のCheckedListBoxで1つだけ選択を許可するには、ユーザーがアイテムをチェックするたびに、他のすべてのアイテムのチェックを外すように設定します。
これを実現するためには、CheckedListBoxのItemCheck
イベントを利用します。
このイベントで、ユーザーが新しいアイテムをチェックした際に、すでにチェックされている他のアイテムのチェックをプログラムで外す処理を追加します。
これにより、常に1つのアイテムだけがチェックされる状態を維持できます。
CheckedListBoxで1つだけ選択を許可する方法
単一選択の必要性
CheckedListBoxは、複数の項目をチェックボックス形式で表示するコントロールです。
通常、複数の項目を同時に選択できるように設計されています。
しかし、特定のシナリオでは、ユーザーに1つの項目だけを選択させたい場合があります。
例えば、以下のようなケースが考えられます。
- ユーザーに1つのオプションだけを選ばせたい場合
- 設定画面で、互いに排他的なオプションを選択させたい場合
- フォームの入力で、1つのカテゴリを選択させたい場合
このような場合、CheckedListBoxを単一選択モードで動作させる必要があります。
CheckedListBoxの制限
CheckedListBoxは、デフォルトでは複数選択を許可する設計になっています。
そのため、単一選択を実現するためには、追加のロジックを実装する必要があります。
以下の制限があります。
- デフォルトでは、複数の項目をチェックできる
- 単一選択をサポートするプロパティやメソッドが存在しない
これらの制限を克服するために、イベントを活用してカスタムロジックを実装する必要があります。
ItemCheckイベントの活用
CheckedListBoxで単一選択を実現するためには、ItemCheckイベントを活用します。
このイベントは、チェック状態が変更される直前に発生します。
これを利用して、他の項目のチェックを外すロジックを実装します。
以下に、ItemCheckイベントを使用したサンプルコードを示します。
using System.Windows.Forms;
public partial class MyForm : Form
{
CheckedListBox checkedListBox1;
public MyForm()
{
InitializeComponent();
checkedListBox1 = new CheckedListBox();
// チェックボックスの項目を追加
checkedListBox1.Items.Add("項目1");
checkedListBox1.Items.Add("項目2");
checkedListBox1.Items.Add("項目3");
// ItemCheckイベントのハンドラを追加
checkedListBox1.ItemCheck += CheckedListBox1_ItemCheck;
// フォームに追加
Controls.Add(checkedListBox1);
}
private void CheckedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
{
// チェックされる項目のインデックスを取得
int index = e.Index;
// チェックされる場合のみ処理を行う
if (e.NewValue == CheckState.Checked)
{
// 他のすべての項目のチェックを外す
for (int i = 0; i < checkedListBox1.Items.Count; i++)
{
if (i != index)
{
checkedListBox1.SetItemChecked(i, false);
}
}
}
}
}
このコードでは、ItemCheckイベントを利用して、選択された項目以外のチェックを外す処理を行っています。
これにより、CheckedListBoxで1つだけ選択を許可する動作を実現しています。
実装手順
フォームの準備
まず、CheckedListBoxを含むフォームを準備します。
Visual Studioのデザイナを使用して、フォームにCheckedListBoxを配置します。
以下の手順でフォームを準備します。
- Visual Studioで新しいWindowsフォームアプリケーションプロジェクトを作成します。
- フォームデザイナを開き、ツールボックスからCheckedListBoxをドラッグしてフォームに配置します。

- CheckedListBoxのプロパティを設定し、必要に応じて項目を追加します。
ItemCheckイベントの設定
次に、CheckedListBoxのItemCheckイベントを設定します。
このイベントは、チェック状態が変更される直前に発生します。
イベントハンドラを追加して、単一選択を実現するためのロジックを実装します。
public partial class MyForm : Form
{
public MyForm()
{
InitializeComponent();
// ItemCheckイベントのハンドラを追加
// コントロールの変数名は自分のプロジェクトに合わせて変えてください
checkedListBox1.ItemCheck += CheckedListBox1_ItemCheck;
}
}
チェック状態の管理
ItemCheckイベントハンドラ内で、チェック状態を管理します。
選択された項目以外のチェックを外すことで、単一選択を実現します。
以下のコードを参考にしてください。
private void CheckedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
{
// チェックされる項目のインデックスを取得
int index = e.Index;
// チェックされる場合のみ処理を行う
if (e.NewValue == CheckState.Checked)
{
// 他のすべての項目のチェックを外す
for (int i = 0; i < checkedListBox1.Items.Count; i++)
{
if (i != index)
{
checkedListBox1.SetItemChecked(i, false);
}
}
}
}
他のアイテムのチェックを外す方法
上記のコードでは、選択された項目以外のチェックを外す方法を示しています。
ItemCheckイベントハンドラ内で、ループを使用して他の項目のチェックを外します。
これにより、CheckedListBoxで1つだけ選択を許可する動作を実現します。
e.Index
を使用して、現在チェックされる項目のインデックスを取得します。e.NewValue
がCheckState.Checked
の場合にのみ、他の項目のチェックを外します。SetItemCheckedメソッド
を使用して、他の項目のチェックを外します。
この方法により、CheckedListBoxで単一選択を実現することができます。
応用例
複数のCheckedListBoxでの単一選択
複数のCheckedListBoxを使用する場合、それぞれのCheckedListBoxで単一選択を実現することができます。
各CheckedListBoxに対して個別にItemCheckイベントを設定し、同様のロジックを適用します。
以下に、複数のCheckedListBoxで単一選択を実現するサンプルコードを示します。
public partial class MyForm : Form
{
public MyForm()
{
InitializeComponent();
// 複数のCheckedListBoxに対してItemCheckイベントのハンドラを追加
checkedListBox1.ItemCheck += CheckedListBox_ItemCheck;
checkedListBox2.ItemCheck += CheckedListBox_ItemCheck;
}
private void CheckedListBox_ItemCheck(object sender, ItemCheckEventArgs e)
{
CheckedListBox listBox = sender as CheckedListBox;
int index = e.Index;
if (e.NewValue == CheckState.Checked)
{
for (int i = 0; i < listBox.Items.Count; i++)
{
if (i != index)
{
listBox.SetItemChecked(i, false);
}
}
}
}
}
このコードでは、複数のCheckedListBoxに対して同じイベントハンドラを使用し、単一選択を実現しています。
データバインディングとの組み合わせ
CheckedListBoxはデータバインディングをサポートしており、データソースから項目を動的に生成することができます。
データバインディングを使用することで、CheckedListBoxの項目を効率的に管理できます。
以下に、データバインディングを使用したサンプルコードを示します。
public partial class MyForm : Form
{
public MyForm()
{
InitializeComponent();
// データソースを設定
var items = new List<string> { "項目1", "項目2", "項目3" };
checkedListBox1.DataSource = items;
// ItemCheckイベントのハンドラを追加
checkedListBox1.ItemCheck += CheckedListBox1_ItemCheck;
}
private void CheckedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
{
int index = e.Index;
if (e.NewValue == CheckState.Checked)
{
for (int i = 0; i < checkedListBox1.Items.Count; i++)
{
if (i != index)
{
checkedListBox1.SetItemChecked(i, false);
}
}
}
}
}

このコードでは、リストをデータソースとしてCheckedListBoxにバインドし、項目を動的に生成しています。
CheckedListBoxのカスタム描画
CheckedListBoxの外観をカスタマイズするために、DrawItemイベントを使用してカスタム描画を行うことができます。
これにより、項目の色やフォントを変更することが可能です。
以下に、カスタム描画のサンプルコードを示します。
public partial class MyForm : Form
{
public MyForm()
{
InitializeComponent();
// DrawModeをOwnerDrawFixedに設定
checkedListBox1.DrawMode = DrawMode.OwnerDrawFixed;
// DrawItemイベントのハンドラを追加
checkedListBox1.DrawItem += CheckedListBox1_DrawItem;
}
private void CheckedListBox1_DrawItem(object sender, DrawItemEventArgs e)
{
// 項目の描画
e.DrawBackground();
bool isChecked = checkedListBox1.GetItemChecked(e.Index);
string text = checkedListBox1.Items[e.Index].ToString();
Brush brush = isChecked ? Brushes.Red : Brushes.Black;
e.Graphics.DrawString(text, e.Font, brush, e.Bounds);
e.DrawFocusRectangle();
}
}
このコードでは、CheckedListBoxの項目をカスタム描画し、チェックされている項目を赤色で表示しています。
カスタム描画を使用することで、より柔軟なUIデザインが可能になります。
まとめ
この記事では、C#のCheckedListBoxを用いて1つだけ選択を許可する方法について詳しく解説しました。
CheckedListBoxの制限を克服し、ItemCheckイベントを活用することで、単一選択を実現する手順を具体的に説明しました。
これを機に、CheckedListBoxのカスタマイズや応用例を試し、より効果的なユーザーインターフェースを構築してみてください。