ドロップダウンリスト部分はToolStripDropDownで代用
それっぽく見える気がする

using System;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Collections;
namespace WindowsFormsApplication1
{
/// <summary>
/// メインフォーム
/// </summary>
public partial class frmMain : Form
{
/// <summary>
/// コンストラクタ
/// </summary>
public frmMain()
{
// コンポーネントの初期化
InitializeComponent();
Init();
}
/// <summary>
/// 初期化処理
/// </summary>
private void Init()
{
CheckComboBox cmb = new CheckComboBox();
cmb.Items.AddRange(new object[] { "One", "Two", "Three" });
this.Controls.Add(cmb);
}
}
#region "チェックコンボ"
/// <summary>
/// チェックコンボ
/// </summary>
public partial class CheckComboBox : ComboBox
{
private ExToolStripDropDown mExDropDownList;
/// <summary>
/// コンストラクタ
/// </summary>
public CheckComboBox()
{
base.DropDownHeight = 1;
base.DropDownStyle = ComboBoxStyle.DropDown;
mExDropDownList = new ExToolStripDropDown(this);
}
/// <summary>
/// KeyPress処理
/// </summary>
/// <param name="e"></param>
protected override void OnKeyPress(KeyPressEventArgs e)
{
// キー入力を無効化
e.Handled = true;
}
/// <summary>
/// KeyDown処理
/// </summary>
/// <param name="e"></param>
protected override void OnKeyDown(KeyEventArgs e)
{
// キー入力を無効化
e.Handled = true;
}
/// <summary>
/// DropDown時
/// </summary>
/// <param name="e"></param>
protected override void OnDropDown(EventArgs e)
{
mExDropDownList.SetItems(this.Items);
mExDropDownList.Show(this, 0, this.Height);
mExDropDownList.Focus();
}
#region "チェックコンボ用ドロップダウンリスト"
/// <summary>
/// チェックコンボ用のドロップダウンリスト
/// </summary>
private partial class ExToolStripDropDown : ToolStripDropDown
{
private CheckComboBox chCmb;
// チェックボックス記憶用
private ArrayList chkArry = new ArrayList();
/// <summary>
/// コンストラクタ
/// </summary>
/// <param name="cmb"></param>
public ExToolStripDropDown(CheckComboBox cmb)
{
chCmb = cmb;
}
/// <summary>
/// ドロップダウンリストに項目をセット
/// </summary>
/// <param name="cmbItems"></param>
public void SetItems(ComboBox.ObjectCollection cmbItems)
{
if (CheckItemsChanged(cmbItems))
{
ToolStripControlHost h;
CheckBox chk;
// クリア処理
this.Items.Clear();
chkArry.Clear();
chCmb.Text = String.Empty;
// チェックボックス追加
for (int i = 0; i < cmbItems.Count; i++)
{
// チェックボックスの設定
chk = new CheckBox();
chkArry.Add(chk);
chk.Text = cmbItems[i].ToString();
chk.Checked = false;
chk.AutoSize = false;
chk.BackColor = Color.White;
chk.Size = new System.Drawing.Size(chCmb.Width, chk.Height);
// チェック状態変更時のイベント追加
chk.CheckedChanged += chk_CheckedChanged;
// ToolStripDropDOwnListのItemsにチェックボックスを追加
h = new ToolStripControlHost(chk);
h.AutoSize = false;
h.Size = chk.Size;
this.Items.Add(h);
}
}
}
/// <summary>
/// Itemsの内容が変更されたかどうかをチェック
/// </summary>
/// <param name="cmbItems"></param>
/// <returns>true:変更された,false:変更されていない</returns>
private Boolean CheckItemsChanged(ComboBox.ObjectCollection cmbItems)
{
// 項目数の変更チェック
if (chkArry.Count != cmbItems.Count)
{
return true;
}
// 各項目のテキスト内容の変更チェック
for (int i = 0; i < chkArry.Count; i++)
{
if (cmbItems[i].ToString() != ((CheckBox)chkArry[i]).Text)
{
return true;
}
}
return false;
}
/// <summary>
/// チェックボックスのチェック状態が変更されたとき
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void chk_CheckedChanged(object sender, EventArgs e)
{
SetText();
}
/// <summary>
/// チェックされたテキストをカンマ区切りでコンボに出力
/// </summary>
private void SetText()
{
StringBuilder sb = new StringBuilder();
CheckBox chk;
for (int i = 0; i < chkArry.Count; i++)
{
chk = (CheckBox)chkArry[i];
// チェックされてるか
if (chk.Checked)
{
sb.AppendFormat("{0},", chk.Text);
}
}
chCmb.Text = sb.ToString();
if (chCmb.Text.Length > 0)
{
// 末尾のカンマ除去
chCmb.Text = chCmb.Text.Remove(chCmb.Text.Length - 1);
}
}
}
#endregion
}
#endregion
}
最終更新:2011年06月22日 19:32