アットウィキロゴ

ReadOnlyComboBox

  • 似非ReadOnlyComboBox
※ComboBoxStyle.Simpleには未対応


using System;
using System.Windows.Forms;
using System.Drawing;
using System.ComponentModel;

namespace WindowsFormsApplication1
{
    public partial class frmMain : Form
    {
        private ReadOnlyComboBox cmb = new ReadOnlyComboBox();
        private Button btn = new Button();

        /// <summary>
        /// コンストラクタ
        /// </summary>
        public frmMain()
        {
            InitializeComponent();

            // 読み取り専用コンボの初期化
            this.cmb.Location = new System.Drawing.Point(13, 13);
            cmb.Items.AddRange(new object[] { "にほん", "あめりか", "ちゅうごく" });
            this.Controls.Add(this.cmb);

            // ReadOnly切替ボタンの初期化
            this.btn.SetBounds(141, 9, 100, 24);
            this.btn.Text = "ReadOnly切替";
            this.Controls.Add(this.btn);
            this.btn.Click += new System.EventHandler(this.btn_Click);


        }

        /// <summary>
        /// ReadOnly切替ボタンクリック
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_Click(object sender, EventArgs e)
        {
            this.cmb.ReadOnly = !this.cmb.ReadOnly;
        }
    }

    /// <summary>
    /// 読み取り専用プロパティありのコンボ
    /// (ComboBoxStyle.Simpleには未対応)
    /// </summary>
    public class ReadOnlyComboBox : ComboBox
    {
        private ReadOnlyComboButton cmbBtn;
        private ComboBoxStyle _ComboBoxStyle;
        private Boolean _ReadOnly;

        [Description("エディット コントロールの中の文字列を変更できるかどうかを設定します。ComboBoxStyle.Simpleには未対応")]
        [Category("動作")]
        [DefaultValue(false)]
        public Boolean ReadOnly 
        {
            get
            {
                return _ReadOnly;
            }
            set
            {
                _ReadOnly = value;
                ReadOnlyChanged();
            }
        }

        /// <summary>
        /// コンストラクタ
        /// </summary>
        public ReadOnlyComboBox()
        {
            cmbBtn = new ReadOnlyComboButton();
            ReadOnlyChanged();
            cmbBtn.TabStop = false;
            this.Controls.Add(cmbBtn);
        }

        /// <summary>
        /// OnResize(Override)
        /// </summary>
        /// <param name="e"></param>
        protected override void OnResize(EventArgs e)
        {
            cmbBtn.SetBounds(this.Width - 18, 1, 17, this.Height - 2);
            base.OnResize(e);
        }

        /// <summary>
        /// ReadOnlyが変更されたときの処理
        /// </summary>
        private void ReadOnlyChanged()
        {
            // 読み取り専用か?
            if (ReadOnly)
            {
                // 読み取り専用
                _ComboBoxStyle = base.DropDownStyle;
                switch (base.DropDownStyle)
                {
                    case ComboBoxStyle.DropDownList:
                        base.DropDownStyle = ComboBoxStyle.DropDown;
                        this.BackColor = SystemColors.Control;
                        cmbBtn.Visible = true;
                        break;

                    case ComboBoxStyle.DropDown:
                        this.BackColor = SystemColors.Control;
                        cmbBtn.Visible = true;
                        break;

                    case ComboBoxStyle.Simple:
                        break;
                }
            }
            else
            {
                // 編集可能
                cmbBtn.Visible = false;
                switch (_ComboBoxStyle)
                {
                    case ComboBoxStyle.DropDownList:
                        base.DropDownStyle = _ComboBoxStyle;
                        this.BackColor = SystemColors.Window;
                        break;

                    case ComboBoxStyle.DropDown:
                        this.BackColor = SystemColors.Window;
                        break;

                    case ComboBoxStyle.Simple:
                        break;
                }
            }
        }

        /// <summary>
        /// ProcessCmdKey(Override)
        /// </summary>
        /// <param name="msg"></param>
        /// <param name="keyData"></param>
        /// <returns></returns>
        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            // 読み取り専用か?
            if (ReadOnly)
            {
                // 特定のキー入力のみ許可
                switch (keyData)
                {
                    case (Keys.Control | Keys.C):
                    case (Keys.Control | Keys.Left):
                    case (Keys.Control | Keys.Right):
                    case (Keys.Shift | Keys.Left):
                    case (Keys.Shift | Keys.Right):
                    case (Keys.Shift | Keys.Tab):
                    case (Keys.Tab):
                    case (Keys.Right):
                    case (Keys.Left):
                    case (Keys.Home):
                    case (Keys.End):
                        return base.ProcessCmdKey(ref msg, keyData);

                    default:
                        return true;

                }
            }
            else
            {
                return base.ProcessCmdKey(ref msg, keyData);
            }

        }

        /// <summary>
        /// 読み取り専用コンボボタン
        /// </summary>
        private class ReadOnlyComboButton : Control
        {
            protected override void OnPaint(PaintEventArgs e)
            {
                ComboBoxRenderer.DrawDropDownButton(e.Graphics, 
                    new Rectangle(0, 0, this.Width, this.Height), 
                    System.Windows.Forms.VisualStyles.ComboBoxState.Normal);
                base.OnPaint(e);
            }
        }
    }
}



最終更新:2011年07月08日 00:56
ツールボックス

下から選んでください:

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