ReadOnlyComboBox クラスのソースコード
スポンサーリンク
.NET Framework クラス ライブラリにある、System.Windows.Forms.ComboBox クラスを継承したカスタム コントロールです。System.Windows.Forms.TextBox クラスにあります、クライアント入力領域を読み取り専用にする ReadOnly プロパティが加えられています。追加で用意された ReadOnly プロパティは、デザイナからでもコードからでも手軽に扱えます。
これは、暫定版 ですので、不具合がある可能性があります。
ソースコード
動作の保証は致しませんので、改変はご自由に。
C# 全般
/** ReadOnlyComboBox クラス */ using System.ComponentModel; namespace Jeanne.Windows.Forms { public class ReadOnlyComboBox : System.Windows.Forms.ComboBox { #region このクラスのフィールド メンバ private System.ComponentModel.IContainer components; private System.Drawing.Color oldBackColor; private bool keyPressHandled; #endregion #region コンストラクタ public ReadOnlyComboBox() { this.components = new System.ComponentModel.Container(); this.oldBackColor = this.BackColor; } #endregion #region Dispose メソッド (Override) protected override void Dispose(bool disposing) { if (disposing) { if (this.components != null) { this.components.Dispose(); } } base.Dispose(disposing); } #endregion #region OnKeyDown メソッド (Override) protected override void OnKeyDown(System.Windows.Forms.KeyEventArgs e) { if (! this.ReadOnly) { return; } switch (e.KeyCode) { case System.Windows.Forms.Keys.Delete: case System.Windows.Forms.Keys.Up: case System.Windows.Forms.Keys.Down: case System.Windows.Forms.Keys.PageUp: case System.Windows.Forms.Keys.PageDown: case System.Windows.Forms.Keys.F4: { e.Handled = true; break; } case System.Windows.Forms.Keys.Back: case System.Windows.Forms.Keys.V: case System.Windows.Forms.Keys.X: { this.keyPressHandled = true; break; } default: { this.keyPressHandled = false; break; } } } #endregion #region OnKeyPress (Override) protected override void OnKeyPress(System.Windows.Forms.KeyPressEventArgs e) { if (! this.ReadOnly) { this.keyPressHandled = false; return; } if (this.keyPressHandled) { e.Handled = true; this.keyPressHandled = false; return; } if (! char.IsControl(e.KeyChar)) { e.Handled = true; } this.keyPressHandled = false; } #endregion #region ReadOnly プロパティ private bool _ReadOnly; [Category("動作")] [Description("エディット コントロールの中の文字列を変更できるかどうかを設定します。")] [DefaultValue(false)] public bool ReadOnly { get { return this._ReadOnly; } set { this._ReadOnly = value; if (value) { this.oldBackColor = this.BackColor; this.BackColor = System.Drawing.SystemColors.Control; this.ContextMenu = new System.Windows.Forms.ContextMenu(); this.SetStyle(System.Windows.Forms.ControlStyles.Selectable, false); this.SetStyle(System.Windows.Forms.ControlStyles.UserMouse, true); this.UpdateStyles(); this.RecreateHandle(); } else { this.BackColor = this.oldBackColor; this.ContextMenu = null; this.SetStyle(System.Windows.Forms.ControlStyles.Selectable, true); this.SetStyle(System.Windows.Forms.ControlStyles.UserMouse, false); this.UpdateStyles(); this.RecreateHandle(); } } } #endregion } }
VB.NET 全般
'/** ReadOnlyComboBox クラス */ Option Strict On Imports System.ComponentModel Namespace Jeanne.Windows.Forms Public Class ReadOnlyComboBox : Inherits System.Windows.Forms.ComboBox #Region " このクラスのフィールド メンバ " Private components As System.ComponentModel.IContainer Private oldBackColor As System.Drawing.Color Private keyPressHandled As Boolean #End Region #Region " コンストラクタ " Public Sub New() MyBase.New() Me.components = New System.ComponentModel.Container() Me.oldBackColor = Me.BackColor End Sub #End Region #Region " Dispose メソッド (Overrides) " Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean) If disposing Then If Not Me.components Is Nothing Then Me.components.Dispose() End If End If MyBase.Dispose(disposing) End Sub #End Region #Region " OnKeyDown メソッド (Overrides) " Protected Overrides Sub OnKeyDown(ByVal e As System.Windows.Forms.KeyEventArgs) If Not Me.ReadOnly Then Return End If If e.KeyCode = Keys.Delete Then e.Handled = True Return End If If e.KeyCode = Keys.Back Then Me.keyPressHandled = True Return End If If e.Control Then Select Case e.KeyCode Case Keys.V, Keys.X Me.keyPressHandled = True Return End Select End If Me.keyPressHandled = False End Sub #End Region #Region " OnKeyPress メソッド (Overrides) " Protected Overrides Sub OnKeyPress(ByVal e As System.Windows.Forms.KeyPressEventArgs) If Not Me.ReadOnly Then Me.keyPressHandled = False Return End If If Me.keyPressHandled Then e.Handled = True Me.keyPressHandled = False Return End If If Not Char.IsControl(e.KeyChar) Then e.Handled = True End If Me.keyPressHandled = False End Sub #End Region #Region " ReadOnly プロパティ " Private _ReadOnly As Boolean <Category ("動作"), _ Description ("エディット コントロールの中の文字列を変更できるかどうかを設定します。"), _ DefaultValue(False)> _ Public Property [ReadOnly]() As Boolean Get Return Me._ReadOnly End Get Set Me._ReadOnly = Value If Value Then Me.oldBackColor = Me.BackColor Me.BackColor = System.Drawing.SystemColors.Control Me.ContextMenu = New System.Windows.Forms.ContextMenu() Me.SetStyle(ControlStyles.Selectable, False) Me.SetStyle(ControlStyles.UserMouse, True) Me.UpdateStyles() Else Me.BackColor = Me.oldBackColor Me.ContextMenu = Nothing Me.SetStyle(ControlStyles.Selectable, True) Me.SetStyle(ControlStyles.UserMouse, False) Me.UpdateStyles() End If End Set End Property #End Region End Class End Namespace