- PR -

Enum型の複合プロパティ

1
投稿者投稿内容
ハロ
会議室デビュー日: 2007/06/12
投稿数: 6
投稿日時: 2007-06-12 21:47
はじめまして。
いつも参考にさせて頂いてます。

VS2005、C#、WindowsForms のカスタムコントロールで、
Enum型の複合(連動)プロパティを実装したいと思っています。
具体的には、次の事を実現したいと思っています。
 プロパティA
   選択肢: X,Y,Z
 プロパティB
   選択肢: プロパティAの選択内容により可変
    プロパティAの値=Xの時、X1,X2,X3
    プロパティAの値=Yの時、Y1,Y2,Y3
    プロパティAの値=Zの時、Z1,Z2,Z3

プロパティウィンドウで、選択肢から選べる様にしたい為、
列挙型にしたいと思っています。この様な事は可能でしょうか?

「列挙型 動的」などで検索していたところ、
リフレクションやタイプコンバータといったキーワードに
たどり着いたのですが、それらが実現する事に使えるのか、
関係しているのかどうかが、はっきりと理解できませんでした。

それとも、列挙型ではなくもっと違う方法で実現すべき内容なのでしょうか?
よろしくお願いします。
TAM
会議室デビュー日: 2006/11/16
投稿数: 3
投稿日時: 2007-06-13 10:41
引用:

 プロパティA
   選択肢: X,Y,Z
 プロパティB
   選択肢: プロパティAの選択内容により可変
    プロパティAの値=Xの時、X1,X2,X3
    プロパティAの値=Yの時、Y1,Y2,Y3
    プロパティAの値=Zの時、Z1,Z2,Z3

プロパティウィンドウで、選択肢から選べる様にしたい為、
列挙型にしたいと思っています。この様な事は可能でしょうか?




プロパティBの表示内容を動的に変えるということはできないと
思います。私が知らないだけかもですが・・・。

ただ、プロパティAの設定によって、プロパティBで選択できる値を制限する
ということであれば、プロパティBのsetブロックでプロパティAとvalueの内容を
チェックし、不適切な値であればメッセージボックスで警告する方法で代用
できないでしょうか?
KI
大ベテラン
会議室デビュー日: 2007/01/10
投稿数: 239
投稿日時: 2007-06-13 10:45
そもそもプロパティBって、
コントロールではどんな型で実装するつもりなんでしょう?
ガルマ・ザビ
ベテラン
会議室デビュー日: 2007/06/07
投稿数: 55
お住まい・勤務地: ジオン公国
投稿日時: 2007-06-13 11:18
TypeConverterを利用すれば可能ですよ。

TypeConverterは、色々種類があるので扱う型によって
適切なConverterを利用します。

KIさんが言うように、プロパティBの型が不明ですが、
Enum型であれば、EnumConvertを継承したクラスを自身で作成します。

TypeConverterクラスには、GetStandardValuesメソッドが存在します。
このメソッドを利用することで、デザイナウィンドウでプロパティが
クリックされた場合に表示される選択肢の幅を限定することができます。

以下は、MyUserControlというユーザーコントロールに
プロパティA、プロパティBが存在する場合の例です。
(GetStandardValuesメソッドの中身)

コード:

if (context == null || !(context.Instance is MyUserControl))
return base.GetStandardValues(context);

MyUserControl myUserControl= (MyUserControl)context.Instance;

ArrayList range = new ArrayList();

switch (myUserControl.MyEnumProperty_A)
{
case MyEnumProperty_A.X:
range.Add(MyEnumProperty_B.X1);
range.Add(MyEnumProperty_B.X2);
range.Add(MyEnumProperty_B.X3);
break;

case MyEnumProperty_A.Y:
range.Add(MyEnumProperty_B.Y1);
range.Add(MyEnumProperty_B.Y2);
range.Add(MyEnumProperty_B.Y3);
break;

case MyEnumProperty_A.Z:
range.Add(MyEnumProperty_B.Z1);
range.Add(MyEnumProperty_B.Z2);
range.Add(MyEnumProperty_B.Z3);
break;
}

return new StandardValuesCollection(range);




Converterクラスを作成したら、これを利用できるようにしなければなりません。
限定したいのはプロパティBですから、プロパティBを公開している箇所で、
Converterクラスを利用してあげるような記述をします。

コード:

[TypeConverter(typeof(EnumConvertを継承したクラス名))]
public MyEnumProperty_B MyEnumProperty_B
{
get{return this.myEnumProperty_B;}
set{this.myEnumProperty_B = value;}
}



こんな感じでいかがでしょう?

[ メッセージ編集済み 編集者: ガルマ・ザビ 編集日時 2007-06-13 11:24 ]
ハロ
会議室デビュー日: 2007/06/12
投稿数: 6
投稿日時: 2007-06-13 13:30
TAMさん、KIさん、ガルマ・ザビさん
ご返答ありがとうございます。

説明不足ですみませんでした。
プロパティBもEnum型で考えてました。

ガルマさんの例に沿ってやってみたところ
見事実現する事ができました!
内容も理解でき、大変勉強になりました。
ありがとうございました。
1

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