none
コントロールの【Enabled】をFalseにした場合の表示色について RRS feed

  • 質問

  • こんばんわ!

    度々、お世話になります。 早速、質問を記させて頂きます。

    フォームに配置する【checkBox】【dateTimePicker】などを参照のための表示に
    使用したいため、【Enabled】をFalseにして使用しています。

    しかしこの場合、表示色がグレーになってしまいますが【True】の時と同じ色で
    表示したいと思っています。

    【TextBox】の場合は、ReadOnly を【True】にしておけば、不要にいじられない
    ようにできますが、同じような状態を通常の表示色で行いたいのです。

    どんな方法があるのか教えて頂きたく投稿しました。

    どうぞ宜しくお願い致します。

    2011年6月10日 9:31

回答

  • なんか勘違いしてましたね。すみません。

    Enabled = false の状態でなんとかする方法でなく、値の変更を阻害するってのはどうでしょう。

    OnClick メソッドをオーバーライドして無効にしちゃうとか、値を変更されても内部で持ってる値に戻しちゃうとか。

    あまりかっこよくないですけどね。

     

    public class CheckBoxEx : CheckBox

    {

    protected override void OnClick(EventArgs e)

    {

    // 何もしない。

    }

    }

     

    public class DateTimePickerEx : DateTimePicker

    {

    private DateTime valueInternal;

     

    public DateTimePickerEx()

    {

    this.ValueChanged += this.this_ValueChanged;

    }

     

    void this_ValueChanged(object sender, EventArgs e)

    {

    this.Value = valueInternal;

    }

     

    public void SetValue(DateTime value)    // 値の変更はこれを使う。

    {

    this.valueInternal = value;

    this.Value         = value;

    }

    }

    2011年6月10日 18:27
  • 操作できない時はユーザーにそれがわかるようにグレーアウトするのは標準の仕様なので、それを変更する方法は統一的に用意されていません。そうは言っても、最初から閲覧モードでその画面に入っている場合は、ユーザーは変更できないのがわかっているのにグレイアウトしていると見難いですよね。私はこんな場合は変更ボタンをグレイアウトして変更できなくすることが多いです。当然、各コントロールの値は変更できますが、最終的にデータベースに書き込まれないのでOKという考え方です。これが一番簡単な方法だと思います。
    しかしもっと複雑な要件があって、その画面でもいくつかの項目は変更できるようにしなければならない場合があります。この場合は上記の方法は取れません。TextBoxであればReadOnly、CheckBoxやRadioButtonであればAutoCheckで対応できますが、画面はそれだけの種類のコントロールで構成されていない場合もあるでしょう。そんな時は各コントロールを継承して標準の動作であるグレーアウトを変更すれば対応できます。または、ComboBoxをLabelに挿げ替えるなどの方法(ComboBoxのVisibleをfalseにしてLabelのVisibleをtrueにする)も取れます。もう一つ方法があって、透明なパネルで覆うという方法です。透明なパネルで覆った後、各コントロールのTabStopをfalseにすればたぶん大丈夫じゃないかと思います。透明なパネルについては以下を参考にして下さい。

    Is it possible to disable the left most row selector of DataGridView? i.e. make it unclickable?
    http://www.windowsdevelop.com/windows-forms-general/is-it-possible-to-disable-the-left-most-row-selector-of-datagridview-ie-make-it-unclickable-31210.shtml

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2011年6月11日 0:20
    モデレータ
  • CheckBox で AutoCheckを使う方法ですが、これはチェックが入った
    状態で固定されると思いますが、オフの状態で固定する方法はある
    のでしょうか。 あちこち探しましたが見つかりません。

    AutoCheckプロパティをfalseにした時点でCheckBoxのCheckedプロパティの値が固定されますので、CheckBoxのCheckedプロパティがfalseの状態でAutoCheckプロパティをfalseにすれば良いと思います。
    もしくは、AutoCheckプロパティがfalseの状態でも、コードからはCheckBoxのCheckedプロパティの値を変更をでき、それがCheckBoxの外観にも反映されますから(つまりチェックが入ったり消えたり)、コードからCheckedプロパティを変更されても良いでしょう。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2011年6月11日 4:40
    モデレータ

すべての返信

  • this.textBox1.BackColor を明示的に指定してください。

     

    this.textBox1.BackColor = System.Drawing.SystemColors.Window;

    this.textBox1.Enabled = false;

     

    --

    聞く前に色々やってみよう。

    2011年6月10日 9:51
  • galaco さん、こんばんわ!

    質問の趣旨が旨く伝わらなかったようですね。

    BackColorは、【Enabled】をFalseにしても変化しませんが、ForeColorは、
    グレーになってしまうようです。

    【Enabled】を Falseにセットした【checkBox】【dateTimePicker】の文字
    部分 ForeColorを黒のままにしておく方法を知りたいと思っています。

    また、【dateTimePicker】では、カレンダーの色は細かく設定できるよう
    ですが、【Value】を表示している所の色を決めるプロパティーが見つかり
    ません。 これは、変えれないって事でしょうか?

    よろしくお願いします。

    2011年6月10日 12:18
  • なんか勘違いしてましたね。すみません。

    Enabled = false の状態でなんとかする方法でなく、値の変更を阻害するってのはどうでしょう。

    OnClick メソッドをオーバーライドして無効にしちゃうとか、値を変更されても内部で持ってる値に戻しちゃうとか。

    あまりかっこよくないですけどね。

     

    public class CheckBoxEx : CheckBox

    {

    protected override void OnClick(EventArgs e)

    {

    // 何もしない。

    }

    }

     

    public class DateTimePickerEx : DateTimePicker

    {

    private DateTime valueInternal;

     

    public DateTimePickerEx()

    {

    this.ValueChanged += this.this_ValueChanged;

    }

     

    void this_ValueChanged(object sender, EventArgs e)

    {

    this.Value = valueInternal;

    }

     

    public void SetValue(DateTime value)    // 値の変更はこれを使う。

    {

    this.valueInternal = value;

    this.Value         = value;

    }

    }

    2011年6月10日 18:27
  • 操作できない時はユーザーにそれがわかるようにグレーアウトするのは標準の仕様なので、それを変更する方法は統一的に用意されていません。そうは言っても、最初から閲覧モードでその画面に入っている場合は、ユーザーは変更できないのがわかっているのにグレイアウトしていると見難いですよね。私はこんな場合は変更ボタンをグレイアウトして変更できなくすることが多いです。当然、各コントロールの値は変更できますが、最終的にデータベースに書き込まれないのでOKという考え方です。これが一番簡単な方法だと思います。
    しかしもっと複雑な要件があって、その画面でもいくつかの項目は変更できるようにしなければならない場合があります。この場合は上記の方法は取れません。TextBoxであればReadOnly、CheckBoxやRadioButtonであればAutoCheckで対応できますが、画面はそれだけの種類のコントロールで構成されていない場合もあるでしょう。そんな時は各コントロールを継承して標準の動作であるグレーアウトを変更すれば対応できます。または、ComboBoxをLabelに挿げ替えるなどの方法(ComboBoxのVisibleをfalseにしてLabelのVisibleをtrueにする)も取れます。もう一つ方法があって、透明なパネルで覆うという方法です。透明なパネルで覆った後、各コントロールのTabStopをfalseにすればたぶん大丈夫じゃないかと思います。透明なパネルについては以下を参考にして下さい。

    Is it possible to disable the left most row selector of DataGridView? i.e. make it unclickable?
    http://www.windowsdevelop.com/windows-forms-general/is-it-possible-to-disable-the-left-most-row-selector-of-datagridview-ie-make-it-unclickable-31210.shtml

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2011年6月11日 0:20
    モデレータ
  • galaco さん、有難うございます。

    色々な方法が考えられるのですね。

    順番に試してみたいと思っています。

    どうも、有難うございました。

    2011年6月11日 4:04
  • trapemiya さん、詳しいご説明頂き有難うございます。

    基本的には標準の仕様と言う事なのですね。

    でも、仰るように閲覧モードで見にくいのです。 しかも、画面内で
    項目により変更の可否が混在しています。


    ここで、一つ質問があります。

    CheckBox で AutoCheckを使う方法ですが、これはチェックが入った
    状態で固定されると思いますが、オフの状態で固定する方法はある
    のでしょうか。 あちこち探しましたが見つかりません。

     


    教えて頂いた「各コントロールを継承して・・・」「透明なパネルで
    覆う・・・」等の方法については未経験なので、これから勉強してみます。

    よろしくお願いします。

    2011年6月11日 4:10
  • CheckBox で AutoCheckを使う方法ですが、これはチェックが入った
    状態で固定されると思いますが、オフの状態で固定する方法はある
    のでしょうか。 あちこち探しましたが見つかりません。

    AutoCheckプロパティをfalseにした時点でCheckBoxのCheckedプロパティの値が固定されますので、CheckBoxのCheckedプロパティがfalseの状態でAutoCheckプロパティをfalseにすれば良いと思います。
    もしくは、AutoCheckプロパティがfalseの状態でも、コードからはCheckBoxのCheckedプロパティの値を変更をでき、それがCheckBoxの外観にも反映されますから(つまりチェックが入ったり消えたり)、コードからCheckedプロパティを変更されても良いでしょう。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2011年6月11日 4:40
    モデレータ
  • trapemiya さん、何度も有難うございます。

    先ほど試した際にも、CheckBoxのCheckedプロパティがfalseの状態で
    AutoCheckプロパティをfalseにしていたつもりなのですが、何か間違って
    いたようです。 お手数をおかけしました。

    それから、コードでCheckBoxのCheckedプロパティの値を変更もできる
    のですね (当たり前と言えば当たり前ですが・・・)

    変に考え込んで、周りが見えなくなっていたようです。

    この後、各コントロールの継承について勉強しようと思っています。
    有難うございました。

    これを持ちまして、このスレッドはクローズさせて頂きます。

    2011年6月11日 5:23