Top / .NET備忘録 / 04.最難関!ComboBox / 07.Locked(ReadOnly) プロパティ その(1)

Locked プロパティは、TextBox においては、ReadOnly プロパティに名前を変えてサポートされましたが、ComboBox ではサポートされなくなりましたので、これを実装します。

ReadOnly プロパティを True にしたときに必要な機能は

・入力によるテキストの変更を受け付けない

ただ一点です。

入力を受け付けない、というのとはまた違います。

Locked プロパティを True にした VB6.0 の ComboBox では、マウスでクリックするとポイントされますし、中のテキストをコピーすることもできます。

EM_SETREADONLY を送ることも考えましたが、背景がグレーになって、キャンセルする方法がみつかりません。

なので、メッセージを握りつぶすことにします。

EDIT コントロールで握りつぶさなければいけないのは、

(1) WM_CHAR (CTRL + C を除く)
(2) クリップボード操作によるテキストの改変(WM_CUT, WM_PASTE, WM_CLEAR, WM_UNDO)
(3) リストボックス選択により送られる WM_SETTEXT

となります。

まずは ReadOnly プロパティを作成します。

    private bool m_ReadOnly = false;
 
    [Browsable(true)]
    [EditorBrowsable(EditorBrowsableState.Always)]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
    [DefaultValue(false)]
    public virtual bool ReadOnly
    {
        get { return m_ReadOnly; }
        set 
        {
            if (m_ReadOnly != value)
            {
                m_ReadOnly = value;
                OnReadOnlyChanged(EventArgs.Empty); 
            }
        }
    }
 
    public event EventHandler ReadOnlyChanged;
 
    protected virtual void OnReadOnlyChanged(EventArgs e)
    {
        if (ReadOnlyChanged != null) ReadOnlyChanged(this, e);
    }

WM_SETTEXT を禁止すると、Text プロパティによる改変を受け付けなくなります。
Text プロパティを override し、ReadOnly を解除してから代入します。

    public override string Text
    {
        get { return base.Text; }
        set
        {
            bool readOnly = m_ReadOnly;
            m_ReadOnly = false;
            base.Text = value;
            m_ReadOnly = readOnly;
        }
    }



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   最終更新のRSS
Last-modified: 2013-03-06 (水) 09:50:11 (1693d)