2009年6月14日日曜日

[.NET]ReadOnly=TrueのTextBox.ForeColorの設定が反映されない場合の対処法

TextBoxの文字列を編集させたくない場合、EnableプロパティかReadOnlyプロパティを使用する。ただ、文字の色(ForeColor)を変更したい場合、Enableを使用する方法だと設定値が無視されてしまう(常に灰色となる)。その場合はReadOnlyを使用すればよい。
※Enableの方でも変更する方法はあるにはあるのだが、カスタムコントロール作成したりと手間がかかる(参考:DOBON.NET
※EnableとReadOnlyの違いはVisual Basic 中学校参照

がしかし、ReadOnlyを使用する方法でForeColorを設定したにも拘わらず、設定が反映されない場合が存在するのだ。仕事でこの問題にぶち当たったので調べてみたが、その原因や解決法を解説した日本語サイトが見つからなかった(俺の検索力不足?)ので、ブログにメモ。

何とか見つけた情報はここ(英語)。このページによると、TextBoxのBackColorプロパティを設定しないと、ForeColorの設定が反映されないようです。

「ちょっと待て、デザイナで確認するとBackColorプロパティには「Control」が設定されているぞ」と思われるかもしれませんが、実は何も設定されていないんです。これはTextBoxクラスの設定値ではなく、親クラスのTextBoxBaseクラスの値なのです(多分)。

ちなみに、TextBoxBase.ForeColorプロパティの「解説」に、以下のような記述があります。
TextBoxBase の ReadOnly プロパティが true に設定されている場合、
このプロパティはオーバーライドされることがあります。

TextBoxクラスのReadOnlyプロパティはTextBoxBaseクラスのそれを継承したものなので、TextBox.ReadOnlyはTextBoxBase.ReadOnlyと同じものです。BackColorプロパティに関する記述はありませんが、少なくともForeColorの値はオーバーライドされることがあるようです。以上より、僕は以下の推測を立てました。
  • ReadOnly=True かつ BackColorが未設定の場合、ForeColorはデフォルト値(黒)でオーバーライドされる
ということで、ForeColorの値を反映させたければBackColorを設定してください。デフォルトの「Control」をセットしたい場合は、一回別の値に変更してから再セットしてください。値が太字(デフォルト値ではない印)になっていればOKです。



このエントリを書くに当たって再度Webを検索してたら、日本語の情報あったよ。。。 俺の検索力…

4 件のコメント:

みゅう さんのコメント...

はじめまして、javaやC#で日本株の売買プログラムを作っている者です。

ForeColorをどうしてもRedにできず悩むこと数時間、ようやくこちらに辿り着き、無事解決できました。

有益な情報ありがとうございました。

おもくそ さんのコメント...

To:みゅうさん
はじめまして!お役に立てて何よりです。これからも有益な情報を発信していけたらと思います。
…てか、そろそろブログ更新しろよ、俺。

tanaka_otupai さんのコメント...

Enableのとき色変えれなかったよなと思い、もしやと調べればヒットしました。
英語サイトまで探索できる能力が羨ましく、助かります。
ありがとうございました。

おもくそ さんのコメント...

Re: tanaka_otupaiさん
どうもです。
ハンドルネーム素敵です。