- PR -

C# TextBoxのEnabled=false時、ForeColorを変更できませんが

投稿者投稿内容
sahara
会議室デビュー日: 2005/06/21
投稿数: 3
投稿日時: 2005-06-21 12:52
いつもお世話になっております。
saharaです。

WindowsForm開発:
TextBoxのEnabled=false時にForeColorをColor.Redに変更すると思います。
然し、TextBoxはDisabled時にForeColorの設定が無効になりましたが…
ご指導お願いいたします。


環境
C#.net
WINXP


[ メッセージ編集済み 編集者: sahara 編集日時 2005-06-21 13:33 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-06-21 13:55
こんにちは、じゃんぬ です。

引用:

TextBoxのEnabled=false時にForeColorをColor.Redに変更すると思います。
然し、TextBoxはDisabled時にForeColorの設定が無効になりましたが…
ご指導お願いいたします。


Windows の仕様です。
ReadOnly を利用などしてください。
フォーカスの制御は UpdateDefaultButton() などをオーバーライドして、
行かないようにすることは可能です。



_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
sahara
会議室デビュー日: 2005/06/21
投稿数: 3
投稿日時: 2005-06-21 15:04
ご返答ありがとうございます。
やはりそうですね。。。

但し、開発仕様では、EnabledをFalseに設定しなければなりませんが。。。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-06-21 15:21
こんにちは、じゃんぬ です。

引用:

但し、開発仕様では、EnabledをFalseに設定しなければなりませんが。。。


だとすると、全部を派生クラスに張り替えて、
OnEnabledChanged で色々細工して、
あたかも Enabled = False のような動きを実現するしかないですね。
Enabled プロパティ自身も Shadow して何かに置き換えなければいけません。



_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
117
ベテラン
会議室デビュー日: 2005/05/09
投稿数: 94
お住まい・勤務地: 大阪府
投稿日時: 2005-06-21 15:26
その仕様を決めた人が知っているはず…と思いたいところですが

#たぶん知らないで決めてるんだろうなぁ
_________________
# Future Is On Fire !
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-06-21 21:08
> TextBoxのEnabled=false時にForeColorをColor.Redに変更すると思います。
 10年前からそんなことはしません。変えられませんから。

 入力コントロールの“状態”はいくつかあって、

  • 入力不可能(読み取り専用)
  • 入力可能
  • 必須入力(空白/未選択禁止)
  • 非表示

くらいが考えられると思います。以前行ったプロジェクトでは、IStatefullというインターフェイスを作って列挙型に上記状態を定義し、TextBox、ComboBox、ListBoxを継承して拡張したコントロールを作りました。
 それぞれのforeColor、backgroundColorはレジストリから取得するようにして、「入力不可能」はEnabledではなく、ReadOnlyで表現しました。
# ComboBoxはTextBoxに張り替える
_________________
sahara
会議室デビュー日: 2005/06/21
投稿数: 3
投稿日時: 2005-06-22 11:21
お返事を頂き、ありがとうございます。

皆様:
かきのように修正をすると、問題が解決されると思います。
protected override void OnEnabledChanged(EventArgs e)
{
...
base.SetStyle(ControlStyles.UserPaint, !this.Enabled);
...
}

protected override void OnPaint(PaintEventArgs e)
{
...
using(StringFormat sf = new StringFormat())
{
if(this.TextAlign == HorizontalAlignment.Center)
{
sf.Alignment = StringAlignment.Center;
}
else if(this.TextAlign == HorizontalAlignment.Left)
{
sf.Alignment = StringAlignment.Near;
}
else
{
sf.Alignment = StringAlignment.Far;
}

e.Graphics.DrawString(base.Text, base.Font, new SolidBrush(ForeColor),
new Rectangle(-1, 2, base.Width, base.Height), sf);

if(this.BorderStyle == BorderStyle.FixedSingle)
{
e.Graphics.DrawRectangle(new Pen(Color.Black), 0, 0,
this.Width - 1, this.Height - 1);
}
}
...
}
ognac
ベテラン
会議室デビュー日: 2005/06/21
投稿数: 65
投稿日時: 2005-06-23 11:08
ognacです.
邪道ですが,
該当するtextBoxと同じ大きさの透明Formを作成します,
TextBoxを所有するFormの子として貼り付ける.(勿論,外枠,タイトルなしのForm)
tabstopを Offにする.
すると, 入力不可の状態がてきます.

どうでしょうか

スキルアップ/キャリアアップ(JOB@IT)