※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