アットウィキロゴ

CheckComboBox

  • 似非チェックボックスドロップダウンリスト
ドロップダウンリスト部分は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
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。