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

スポンサーリンク