none
Controlの背景色をリセットする方法と理由について RRS feed

  • 質問

  • System.Windows.Forms.Controlを継承したクラスの背景色をリセットする方法について、質問させてください。
    方法としては、以下の方法があると思います。
    1.ResetBackColorメソッドを実行する。
    2.BackColor = Color.Empty を設定する。

    1はIntellisenseで表示されないメソッドですので、推奨されていない or 将来削除もあるのではと思い質問させていただきました。

    どちらの方法が推奨されているのか、ご存じの方らおられましたら、理由も合わせて教えていただけないでしょうか。
    また、上記以外の方法があればお教えいただきたく思います。

    ※.Net Framework4.5を使用しています。

    よろしくお願いいたします。
    2017年3月9日 10:41

回答

  • ResetBackColor()メソッドについてですが、ShouldSerialize メソッドと Reset メソッドによる既定値の定義で説明されています。FormデザイナーがBackColorプロパティをリセットする際に使うために用意されています。そのため、アプリケーション使うために用意されているものではありません。

    なお、Control.ResetBackColor()メソッドはドキュメントもきちんと用意されており、削除の予定はありません。

    ただし、BackColorの既定値が何であるかは各コントロールが決定するものであり、どのような値にすべきかはコントロール設計者が決定すべきなようです。Color.Emptyを既定値とするのであれば、それはそれでいいかと。

    2017年3月9日 13:15
  • Visual Studio のプロパティ一覧で[右クリック]→[リセット]を選択した場合と同じ動作を呼び出すには、PropertyDescriptor.ResetValue メソッドを使います。

    TypeDescriptor.GetProperties(yourControl).Find("BackColor", False).ResetValue(yourControl)

    メリットは汎用性。ResetXXX メソッドが Private Sub で実装されていても呼べますし、ResetXXX/ShouldSerializeXXX ではなく DefaultValueAttribute で指定されるタイプのプロパティであってもリセットできるのが利点です。(リセット機構を持たないプロパティの場合は、呼び出しても何もおきません)

    デメリットはパフォーマンス。呼び出しがリフレクションになっているため、実行効率で言えば Public Sub ResetXXX() の方が上です。


    2017年3月10日 1:37

すべての返信

  • ResetBackColor()メソッドについてですが、ShouldSerialize メソッドと Reset メソッドによる既定値の定義で説明されています。FormデザイナーがBackColorプロパティをリセットする際に使うために用意されています。そのため、アプリケーション使うために用意されているものではありません。

    なお、Control.ResetBackColor()メソッドはドキュメントもきちんと用意されており、削除の予定はありません。

    ただし、BackColorの既定値が何であるかは各コントロールが決定するものであり、どのような値にすべきかはコントロール設計者が決定すべきなようです。Color.Emptyを既定値とするのであれば、それはそれでいいかと。

    2017年3月9日 13:15
  • Visual Studio のプロパティ一覧で[右クリック]→[リセット]を選択した場合と同じ動作を呼び出すには、PropertyDescriptor.ResetValue メソッドを使います。

    TypeDescriptor.GetProperties(yourControl).Find("BackColor", False).ResetValue(yourControl)

    メリットは汎用性。ResetXXX メソッドが Private Sub で実装されていても呼べますし、ResetXXX/ShouldSerializeXXX ではなく DefaultValueAttribute で指定されるタイプのプロパティであってもリセットできるのが利点です。(リセット機構を持たないプロパティの場合は、呼び出しても何もおきません)

    デメリットはパフォーマンス。呼び出しがリフレクションになっているため、実行効率で言えば Public Sub ResetXXX() の方が上です。


    2017年3月10日 1:37
  • 回答が遅くなり、申し訳ありません。

    佐祐理様、ご回答ありがとうございました。
    魔界の仮面弁士様、ResetValueでも希望していた背景色のリセットが行えました。ありがとうございます。

    今回実装しているControlサブクラスの仕様は、以下の通りでした。
    1.入力値にエラーがある場合、背景色を変える。
    2.1のエラーを解除した場合、エラー前の背景色を戻す。
      ※ShouldSerializeBackColor() の戻り値も1の実行前と同じであること。

    今回、お教えいただいた事をまとめますと、背景色のリセット方法は以下の3通り。
    1.ResetBackColorメソッドを実行する。
    2.BackColor = Color.Empty を設定する。
    3.PropertyDescriptor.ResetValue メソッドを実行する。

    今回は1をとることにしました。
    実行される処理が2と同じであること。
    また、今回はリフレクションを使わずとも実行できる状態であるためです。

    ご指導、ありがとうございました。

    2017年3月16日 0:52