C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: PropertyGridのReadOnly属性変更


(過去ログ 77 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■45834 / inTopicNo.1)  PropertyGridのReadOnly属性変更
  
□投稿者/ TKO (1回)-(2010/01/20(Wed) 18:43:12)

分類:[VB.NET/VB2005 以降] 

 VB2005にて、メインフォームにあるチェックボックスの状態により、
PropertyGridのReadOnly属性を変更したいのですが、うまくいきません。

 調べてみると、PropertyGridのReadOnly属性変更は、コードから
setアクセサを用いてプロパティを編集することは可能である。とありました。

 PropertyGridのReadOnly属性変更を変更するには、どの様な記述が
必要なのでしょうか?

--- 以下、実現させたいコードの概要 -------------------------------------------
If CheckBox1.Checked = True Then
ZZZ.ReadOnlyAttribute = True '左記のコードは空想です。
else
ZZZ.ReadOnlyAttribute = False '左記のコードは空想です。
End If
--- 以下、クラスの抜粋 -------------------------------------------------------
Public Class ZZZ
Public _AAA_Enum As String = "AAA"
<ReadOnlyAttribute(False), _
Category("AAA")> _
<Description("AAA")> _
Public Property AAA() As String
Get
Return _AAA
End Get
Set(ByVal Value As String)
_AAA = Value
End Set
End Property
End Class 

引用返信 編集キー/
■45839 / inTopicNo.2)  Re[1]: PropertyGridのReadOnly属性変更
□投稿者/ Jitta on the way (512回)-(2010/01/20(Wed) 19:11:34)
No45834 (TKO さん) に返信
>  VB2005にて、メインフォームにあるチェックボックスの状態により、
> PropertyGridのReadOnly属性を変更したいのですが、うまくいきません。
>
>  調べてみると、PropertyGridのReadOnly属性変更は、コードから
> setアクセサを用いてプロパティを編集することは可能である。とありました。
>
>  PropertyGridのReadOnly属性変更を変更するには、どの様な記述が
> 必要なのでしょうか?

これは、既存のコントロールについての話でしょうか?

また、デザイン時に切り替えたいということでしょうか?
引用返信 編集キー/
■45843 / inTopicNo.3)  Re[2]: PropertyGridのReadOnly属性変更
□投稿者/ TKO (2回)-(2010/01/20(Wed) 19:27:04)
No45839 (Jitta on the way さん) に返信
> ■No45834 (TKO さん) に返信
>> VB2005にて、メインフォームにあるチェックボックスの状態により、
>>PropertyGridのReadOnly属性を変更したいのですが、うまくいきません。
>>
>> 調べてみると、PropertyGridのReadOnly属性変更は、コードから
>>setアクセサを用いてプロパティを編集することは可能である。とありました。
>>
>> PropertyGridのReadOnly属性変更を変更するには、どの様な記述が
>>必要なのでしょうか?
>
> これは、既存のコントロールについての話でしょうか?
>
> また、デザイン時に切り替えたいということでしょうか?

メインフォームのコード内で、クラス中に設定した
・・・
<ReadOnlyAttribute(False), _
・・・
この部分を変更し、表示の切り替えを行いたいのですが、
うまく実現できません。



引用返信 編集キー/
■45847 / inTopicNo.4)  Re[1]: PropertyGridのReadOnly属性変更
□投稿者/ 魔界の仮面弁士 (1459回)-(2010/01/20(Wed) 20:35:59)
No45834 (TKO さん) に返信
>  VB2005にて、メインフォームにあるチェックボックスの状態により、
> PropertyGridのReadOnly属性を変更したいのですが、うまくいきません。
ReadOnly 属性を割り当てたのは、PropertyGrid ではなく、
ZZZ クラスの AAA プロパティなのではありませんか?


>  調べてみると、PropertyGridのReadOnly属性変更は、コードから
> setアクセサを用いてプロパティを編集することは可能である。とありました。
それって、下記の事でしょうか?
http://www.atmarkit.co.jp/fdotnet/dotnettips/316pgridattrib/pgridattrib.html

》ReadOnly属性(Boolean値)
》プロパティの「読み取り専用」を指定する。この属性をTrueに指定されたプロパティは、
》PropertyGridコントロールで編集することができなくなる。ただし、この属性により
》読み取り専用に指定されても、コードからsetアクセサを用いてプロパティを
》編集することは可能である 

だとしたそれは、
 obj = New ZZZ()
  obj.AAA = "新しい値"
のように、「ReadOnly属性が付いていても、コードから値をセットできる」事を
示しているのであって、ReadOnlyAttribute の値を編集するという意味ではありません。

引用返信 編集キー/
■45848 / inTopicNo.5)  Re[2]: PropertyGridのReadOnly属性変更
□投稿者/ Hongliang (548回)-(2010/01/20(Wed) 21:15:12)
多少面倒で、いくらか型記述に関する知識が必要ですよ。
具体的には以下のような実装手順になります。

変更したいプロパティ(上記例の AAA)を持っているクラス(上記例の ZZZ)に TypeConverter 属性を付ける。
ZZZ には Browsable(False) なプロパティ AAAReadOnly を用意。

TypeConverter から派生したクラス(仮に ZZZConverter とする)を作成する。ZZZ の TypeConverter 属性の引数にはこの ZZZConverter を指定する。
GetPropertiesSupported をオーバーライドし、True を返させる。
GetProperties をオーバーライドし、適切な PropertyDescriptorCollection を返す(後述)。

PropertyDescriptor から派生したクラス(仮に AAAPropertyDescriptor とする)を作成する。直接派生するのは面倒なので、ZZZConverter のネストクラスとして SimplePropertyDescriptor から派生するのが便利。
AAAPropertyDescriptor のコンストラクタの引数に ZZZ を用意し、渡された ZZZ をフィールドに保存しておく。
GetValue と SetValue をオーバーライドし、適切な処理を実装する(引数 component を ZZZ にキャストし、GetValue ならその AAA を返し、SetValue ならその AAA に value を AAA の型にキャストして代入する)。
IsReadOnly をオーバーライドし、フィールドの ZZZ の AAAReadOnly を返す。


さて、GetProperties ですが、次のような実装でいいでしょう。

TypeDescriptor.GetProperties(Object, Attribute(), Boolean) を使ってカスタムされていないオリジナルの PropertyDescriptorCollection を取得する。
この PropertyDescriptorCollection と同数の PropertyDescriptor 配列を作成する。
For ループで、PropertyDescriptorCollection の中身をそれぞれ PropertyDescriptor 配列に移す。
ただし、Name が AAA の PropertyDescriptor のみ、AAAPropertyDescriptor を代わりに PropertyDescriptor 配列に格納する。
PropertyDescriptor 配列から PropertyDescriptorCollection を作成して返す。


あとは、PropertyGrid の SelectedObject に渡した ZZZ インスタンスの AAAReadOnly を変更した上で PropertyGrid の Refresh を呼び出せば、読み取り専用かどうかが切り替わるようになります。
引用返信 編集キー/
■45853 / inTopicNo.6)  Re[3]: PropertyGridのReadOnly属性変更
□投稿者/ Jitta on the way (515回)-(2010/01/21(Thu) 07:35:44)
No45843 (TKO さん) に返信
>>これは、既存のコントロールについての話でしょうか?
>>
>>また、デザイン時に切り替えたいということでしょうか?
>
> メインフォームのコード内で、クラス中に設定した
> ・・・
> <ReadOnlyAttribute(False), _
> ・・・
> この部分を変更し、表示の切り替えを行いたいのですが、
> うまく実現できません。
>
>
>

問い合わせの回答になってないんですけど。

いつ、どこで、どうやって、値を書き換えた結果を見たいのでしょうか。
つか、クラスのメンバーに付ける属性は、変更不能なはず。少なくとも、クラス インスタンスにくっつくものではありません。
引用返信 編集キー/
■45951 / inTopicNo.7)  Re[3]: PropertyGridのReadOnly属性変更
□投稿者/ TKO (3回)-(2010/01/22(Fri) 09:51:58)

 返信送れましたが、Jitta on the way様、魔界の仮面弁士様、Hongliang様、有り難う御座います。
また、うまく質問/回答が出来ず申し訳ありませんでした。

 皆様から、教えて頂きました事を基に色々と調べてみましたが、単純には実現出来そうにない
というのは判りました。(私には・・・)
 また、実現出来るかどうかまで具体化出来ていないのが実情ですが、とりあえず、「解決済み」
ということにさせて頂きます。

 本当に、ありがとうございました。




解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -