- PR -

プロパティ値が規定値かどうかの判定方法

1
投稿者投稿内容
じょんのび
常連さん
会議室デビュー日: 2004/05/06
投稿数: 20
投稿日時: 2006-08-27 09:10
プロパティ値が規定値であるかを、プログラム実行中に条件判定したいと思っています。

例えば、TextBox の Colorプロパティ の規定値(DefaultValue)は Window ですが、
規定値 のままの場合は、Enabled の状態に応じて背景色が変化します。
(一般的な環境では、白と灰色)
それに対して、規定値である Window を明示的にセットされた場合
(プロパティウィンドウで言うと太字の状態)には、
Enabled の状態が変化しても背景色が変わりません。(一般的な環境では常に白)

プログラム中で TextBox の色を変更させてから元の色に戻したい場合があるのですが、
変更する前の色を変数に保持する際に"規定値"かどうかを判定したいと思っています。
※規定値に戻す方法に関しては、BackColor に Color.Empty を
 セットする事で実現できました。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-08-27 09:42
引用:

じょんのびさんの書き込み (2006-08-27 09:10) より:

プログラム中で TextBox の色を変更させてから元の色に戻したい場合があるのですが、
変更する前の色を変数に保持する際に"規定値"かどうかを判定したいと思っています。


あるインスタンスの属性を取得するということであれば、
  1. System.ComponentModel.TypeDescriptor クラスの GetProperties メソッドで、
    System.ComponentModel.PropertyDescriptorCollection のインスタンスを取得。
  2. PropertyDescriptorCollection のインデクサから、PropertyDescriptor を取得。
  3. PropertyDescriptor の Attributes プロパティから、
    System.ComponentModel.AttributeCollection が取得。
  4. AttributeCollection のインデクサから特定の属性を取得して、その属性に型変換。
  5. その属性から Value プロパティ (属性によっては存在しない) を参照する。
なのですが、

引用:

例えば、TextBox の Colorプロパティ の規定値(DefaultValue)は Window ですが、


これは... (;^-^)
よく考えてみてください。

# Color プロパティは BackColor プロパティのことだと思いますが...

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
じょんのび
常連さん
会議室デビュー日: 2004/05/06
投稿数: 20
投稿日時: 2006-08-27 17:18
じゃんぬねっとさん、ご返答ありがとうございます。

引用:

じゃんぬねっとさんの書き込み (2006-08-27 09:42) より:

これは... (;^-^)
よく考えてみてください。

# Color プロパティは BackColor プロパティのことだと思いますが...


その通りでした。BackColor の事です。(*^-^*)

教えて頂いた方法を試みていまして、次の様な事だと思うのですが...
コード:
    AttributeCollection attributes = TypeDescriptor.GetProperties(textBox1)["BackColor"].Attributes;
    DefaultValueAttribute defaultValue = (DefaultValueAttribute)attributes[typeof(DefaultValueAttribute)];

    MessageBox.Show(defaultValue.Value.ToString());


defaultValue には、結果 null が返ってきてしまいます。
何か間違った事をしていると思い、調査しているところです。

ちなみに、上記の方法はプロパティの規定値を取得する事になりますよね?
(これも新たな知識となり大変有難いと思っています)
私の質問文が分かりにくかったかと思いますが、
BackColor プロパティの現在の値が、規定値のままの "Window" であるのか、
ユーザーがセットした "Window" であるのかを知りたかったのです。
(私の誤解で、その点が伝わっていたらすみません)
同じ "Window" でも、規定値のままか、ユーザーがセットしたかで、
Enabled が変化した際の動作(背景色の変化)に違いがある様ですので、
そのどちらであるかを取得したいと思っております。
ya
大ベテラン
会議室デビュー日: 2002/05/03
投稿数: 212
投稿日時: 2006-08-27 18:06
そっちじゃなくて、PropertyDescriptor.ShouldSerializeValueメソッドを使用すること。動的に判定する必要があるプロパティの存在があるからShouldSerializePropertyメソッドの存在も忘れてはいけない。
細かい動作はMSDNの該当項目読んでください。

# 以下追記。

コード:


private PropertyType property = DefaultProperty;
public PropertyType Property {
get { return this.property; }
set { this.isPropertyChanged = true; this.property = value; }
}

private bool isPropertyChanged = false;
private void ShouldSerializeProperty() {
return isPropertyChanged;
}




こういう実装も「あり」なのです。


[ メッセージ編集済み 編集者: ya 編集日時 2006-08-27 18:18 ]

[ メッセージ編集済み 編集者: ya 編集日時 2006-08-27 18:20 ]
sou
ベテラン
会議室デビュー日: 2002/09/25
投稿数: 56
投稿日時: 2006-08-28 00:09
BackColorChangedイベントでBackColorプロパティの値が変更されたかどうかを見張ればいいのでは?
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2006-08-28 00:27
( ´_ゝ`)y━; モフー。
じょんのび
常連さん
会議室デビュー日: 2004/05/06
投稿数: 20
投稿日時: 2006-08-28 07:24
yaさん、souさん、ありがとうございます。

皆さんのご意見を参考に、いろいろ試してみたいと思います。

souさんが言われている、BackColorChanged については、
ごもっともなご意見だと思いましたが、
ただ、デザイン時に変更されたかどうかは拾えないかとも思うのですが、
確認してみたいと思います。
Yam
大ベテラン
会議室デビュー日: 2003/09/13
投稿数: 179
お住まい・勤務地: だんじり祭りの地
投稿日時: 2006-08-28 09:49
本題とは無関係ですが、(~~;
Default vakueは
×規定値
○既定値
1

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