System.Windows.Forms.TextBoxコントロールのEnabledプロパティをFalseにすると、文字の色と背景が灰色になりますが、ここではEnabledプロパティをFalseにしても文字の色と背景色が変わらないようにする方法を紹介します。
TextBoxの背景色だけであれば、EnabledプロパティをFalseにした後、BackColorプロパティを設定するだけで、色を変更できます。ただし、ForeColorはこの方法では変更できないようです。(.NET Framework 1.1、2.0で確認)
TextBox1.Enabled = False '背景色を灰色にしない TextBox1.BackColor = TextBox1.BackColor
TextBox1.Enabled = false; //背景色を灰色にしない TextBox1.BackColor = TextBox1.BackColor;
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などのプロパティを一切無視していますので、あくまで参考としてご覧ください。
''' <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
/// <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プログラミング研究 第49号」で紹介したものを基にしています。)