DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

TextBoxコントロールのEnabledプロパティをFalseにしても前景色と背景色を変えないようにする

System.Windows.Forms.TextBoxコントロールのEnabledプロパティをFalseにすると、文字の色と背景が灰色になりますが、ここではEnabledプロパティをFalseにしても文字の色と背景色が変わらないようにする方法を紹介します。

BackColorを変更する

TextBoxの背景色だけであれば、EnabledプロパティをFalseにした後、BackColorプロパティを設定するだけで、色を変更できます。ただし、ForeColorはこの方法では変更できないようです。(.NET Framework 1.1、2.0で確認)

VB.NET
コードを隠すコードを選択
TextBox1.Enabled = False
'背景色を灰色にしない
TextBox1.BackColor = TextBox1.BackColor
C#
コードを隠すコードを選択
TextBox1.Enabled = false;
//背景色を灰色にしない
TextBox1.BackColor = TextBox1.BackColor;

ReadOnlyにする

TextBoxの前景色を変えないようにするには、EnabledプロパティをFalseにする代わりに、ReadOnlyプロパティをTrueにするという方法があります。ReadOnlyプロパティをTrueにしても背景色は灰色となりますが、上の例と同様にBackColorプロパティを設定すれば、背景色を変えなくすることもできます。

自分で描画する

ReadOnlyを使うのではなく、どうしてもEnabledプロパティをFalseにしても前景色と背景色が変わらないようにしたいということであれば、TextBoxクラスから派生したクラスを作成し、OnPaintメソッドをオーバーライドすることにより自分で文字列を描画するという方法があります。この方法は、「Windows Forms FAQ - 27.15 When I set a TextBox to Readonly or set Enabled to false, the text color is gray. How can I force it to be the color specified in the ForeColor property of the TextBox.」で紹介されています。しかし残念ながらここに紹介されている方法では、TextBoxのEnabledがTrueの時に別のフォント(システムフォント?)でTextが表示されてしまいます。

これを防ぐには、TextBoxのEnabledがFalseの時だけ自分で描画するようにします。次の例ではOnEnabledChangedメソッドをオーバーライドすることにより、EnabledがTrueの時のみ独自に描画するようにしています。このクラスはTextAlignやRightToLeftなどのプロパティを一切無視していますので、あくまで参考としてご覧ください。

VB.NET
コードを隠すコードを選択
''' <summary>
''' EnabledがFalseでも前景色、背景色が変わらないTextBox
''' </summary>
Class MyTextBox
    Inherits TextBox

    Protected Overrides Sub OnEnabledChanged(ByVal e As EventArgs)
        MyBase.OnEnabledChanged(e)
        'EnabledがFalseの時だけ自分で描画する
        If Me.Enabled Then
            Me.SetStyle(ControlStyles.UserPaint, False)
        Else
            Me.SetStyle(ControlStyles.UserPaint, True)
        End If
        '再描画
        Me.Invalidate()
    End Sub

    'TextBoxを描画する
    Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
        MyBase.OnPaint(e)
        Dim b As New System.Drawing.SolidBrush(Me.ForeColor)
        '文字列を描画する
        e.Graphics.DrawString(Me.Text, Me.Font, b, -1, 1)
        b.Dispose()
    End Sub
End Class
C#
コードを隠すコードを選択
/// <summary>
/// EnabledがFalseでも前景色、背景色が変わらないTextBox
/// </summary>
class MyTextBox : TextBox
{
    protected override void OnEnabledChanged(EventArgs e)
    {
        base.OnEnabledChanged(e);
        //EnabledがFalseの時だけ自分で描画する
        if (this.Enabled)
            this.SetStyle(ControlStyles.UserPaint, false);
        else
            this.SetStyle(ControlStyles.UserPaint, true);
        //再描画
        this.Invalidate();
    }

    //TextBoxを描画する
    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        System.Drawing.Brush b =
            new System.Drawing.SolidBrush(this.ForeColor);
        //文字列を描画する
        e.Graphics.DrawString(this.Text, this.Font, b, -1, 1);
        b.Dispose();
    }
}

このような方法を無理して使うよりも、できることならReadOnlyプロパティを使うか、別のもっと簡単な方法を考える方がよいでしょう。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • このサイトで紹介されているコードの多くは、例外処理が省略されています。例外処理については、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。