none
PropertyウィンドウまたはPropertyGridの表示内容の動的変更 RRS feed

  • 質問

  • いろいろ調べましたが解決できませんので皆さんにお聞きします。

    分かりやすい例としては以下のようなシナリオです。

    TextBoxから派生するカスタムコントロールを作ります。

    このコントロールは独自のプロパティを2つ備えます。

    たとえば、bool型の"数値専用"と、int型の"小数部桁数"です。

    "数値専用"がfalseと設定されたとき、"小数部桁数"の指定は無意味です。そこで、これを灰色表示かまたは隠すかして、入力できないようにしたいのです。

    また、"数値専用"がtrueと設定されたときは、"小数部桁数"を設定可能な状態にしたいのです。

     

    以上のようなことは、Visual Studioのプロパティウィンドウに対して可能でしょうか?

    また、PropertyGridコントロールを直接使えば可能となるでしょうか?

    どなたか方法をご教示いただけると有り難いです。

    よろしくお願いします。

     

     

    2006年12月10日 2:26

すべての返信

  •  Yamakei さんからの引用

    "数値専用"がfalseと設定されたとき、"小数部桁数"の指定は無意味です。そこで、これを灰色表示かまたは隠すかして、入力できないようにしたいのです。

    また、"数値専用"がtrueと設定されたときは、"小数部桁数"を設定可能な状態にしたいのです。

    以上のようなことは、Visual Studioのプロパティウィンドウに対して可能でしょうか?

     
    普通に TypeConverter を作成して GetProperties の返却リストを編集すればよいとおもいます。
     

     
    [TypeConverter("XxxxTypeConverter")]
    public class Xxxx : TextBox
    {
      // 数値専用プロパティを変更すると PropertyGrid を再クエリさせるように指定
      [class=identifier>RefreshProperties ( RefreshProperties.All ) ]
      public bool 数値専用
      {
        get { ... }
        set { ... }
      }
     
      // 少数部桁数はデフォルトで見えないことにする(Disable にしたいなら ReadOnly で)
      [Browsable(false)]
      public int 小数部桁数
      {
        get { ... }
        set { ... }
      }
    }
     
    internal class XxxTypeConverter : TypeConverter
    {
        public override PropertyDescriptorCollection GetProperties(
            ITypeDescriptorContext context,
            Object value,
            Attribute[] attributes)
        {
            PropertyDescriptorCollection  coll = base.GetProperties(context, value, attributes);
     
            // 数値専用が true の時、一覧に小数部桁数を加える
            if ((value as Xxx).数値専用)
            {
                   PropertyDescriptorCollection nonBrowsableProperties =
                            TypeDescriptor.GetProperties(value, new Attribute[] { BrowsableAttribute.No });
     
                   coll.Add(nonBrowsablePropeties.Find("少数部桁数", false));
            }       
     
            return coll;
        }
    }
     

     
     
    動作確認はしていないので、もしかすると挿入する PropertyDescriptor の Attributes に入っている BrowsableAttribute を入れ替えしないといけないかもしれません。
    (ReadOnlyAttribute の場合は、挿入処理はいらなくて、入れ替え処理が必須です)
     
    2006年12月10日 9:20
  • さっそくトライしてみたいと思います。

    親切なご連絡をありがとうございました。

    2006年12月10日 10:44
  •  Yamakei さんからの引用

    "数値専用"がfalseと設定されたとき、"小数部桁数"の指定は無意味です。そこで、これを灰色表示かまたは隠すかして、入力できないようにしたいのです。
    また、"数値専用"がtrueと設定されたときは、"小数部桁数"を設定可能な状態にしたいのです。

    単純にEnabledとかVisibleでいいんじゃないでしょうか?
    数値専用はEnabledよりも優先されます。
     
    public class MyTextBox: TextBox
    {
            public MyTextBox()
            {
                InitializeComponent();
            }
            private bool _数値専用 = true;
     
            [RefreshProperties(RefreshProperties.All)]
            public bool 数値専用
            {
                get
                {
                    return _数値専用;
                }
                set
                {
                    _数値専用 = value;
                    this.Enabled = value;
                }
            }
     
            public int 小数部桁数
            {
                get
                {
                    int intValue;
                    if (int.TryParse(this.Text, out intValue)) return intValue;
                    return 0; //無入力・異常入力
                }
                set { this.Text = value.ToString(); }
            }
    }
     
    2006年12月12日 0:46
  • >数値専用はEnabledよりも優先されます。
    というよりこの場合数値専用を使ってEnabledは単体で使わない方がいいです。

    #意味合いを取り違えていたようです。
    #この2つの投稿はとりあえず無視してください。

    2006年12月12日 0:50
  • K.Takaoka様へ

    お蔭様で目的を達することができました。

    なお、補足しますと、GetPropertiesSupported()をoverrideして true を返す必要があるとわかりました。また、base.GetProperties()では思わしくないので、TypeDescriptor.GetProperties()を使いました。

    貴重なアドバイスをありがとうございました。

    2006年12月12日 10:44
  • PropertyDescriptorCollection.Add は、.Net2.0でサポートされていないはずですが、
    正常に動いているのでしょうか?

    私の環境では {"指定されたメソッドはサポートされていません。"} の例外が発生しています。

    2006年12月13日 8:15
  • PropertyDescriptorCollectionが Add()をサポートしていないということはありません。なにしろコレクションですから。

    その例外は Add()しようとするものの中身がおかしいという指摘だろうと予想します。私もAdd()で例外に遭遇した記憶はあります。(同じ例外かどうかは定かではありませんが) 確か、Add()の引数にnullを与えた時だったかも知れません。今は例外は出ていません。

    2006年12月13日 9:06
  • coll.Add(pd) でbreakさせて、coll.readOnlyを確認するとtrueです。
    ILで確認しましたが readOnly が true だと NotSupportedException を発生します。


            public override bool GetPropertiesSupported(ITypeDescriptorContext context)
            {
                return true;
            }
            public override PropertyDescriptorCollection GetProperties(
                ITypeDescriptorContext context,
                Object value,
                Attribute[] attributes)
            {
                PropertyDescriptorCollection coll = TypeDescriptor.GetProperties(value, attributes,true);
     
                // 数値専用が true の時、一覧に小数部桁数を加える
                if ((value as MyTextBox).数値専用)
                {
                    PropertyDescriptorCollection nonBrowsableProperties =
                            TypeDescriptor.GetProperties(value, new Attribute[] { BrowsableAttribute.No });
                    PropertyDescriptor pd = nonBrowsableProperties.Find("小数部桁数", false);
                    coll.Add(pd);
                }
     
                return coll;
            }
    2006年12月13日 12:41