カテゴリ:カテゴリ未分類
どもです。 タイトルの通り、何も考えないでクラスだけを作ってデザイナでフォームに そのユーザーコントロールを取り付けても、独自クラス型のプロパティ値が 操作出来なくてちょっとハマッた。色々、とある所に質問してやっと解決。 "Imports System.ComponentModel"が宣言されているものとして解説します。 デザイナ時(デザイン画面)に独自クラス型をプロパティウィンドウで操作する為には、 その独自クラスにTypeConverter属性を与える必要がある。 <TypeConverter(GetType(ExpandableObjectConverter))> _ しかしこれだけではデザイナで値を変更入力してもビルド/コンパイルすると 以前の値に戻ってしまう。つまり値が保存されない。 デザイン画面で入力した値をしっかりと保存させ、実行時に反映させる為には、 その独自クラス型変数への参照宣言であるプロパティ部分に DesignerSerializationVisibility.Content属性を与える必要がある。 プロパティのDesignerSerializationVisibility属性は、規定では.Visibleとなっていて、 この場合値型プロパティならそのまま保存されるけど クラスのような参照型だと保存されない。 その為、例えば独自クラスであったりコレクション型であったり このような参照型?のプロパティに対しては規定値の.Visibleではなく その内部(Contents)のそれぞれのプロパティを保存する.Contentを指定する必要がある。 <DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _ ちなみに、プロパティウィンドウ右クリックでリセットを有効にしたい場合は その値型プロパティにDefaultValue属性を指定すれば良い。 <DefaultValue({※プロパティ型に準拠した初期値を指定})> _ 以下はデザイン画面で値を変更/保存出来る独自クラスを プロパティに持つユーザーコントロールのサンプルです。 Imports System.ComponentModel Public Class UserControl1 Private m_clsUserClass As New clsUserClass <DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _ Public Property UserClass() As clsUserClass Get Return m_clsUserClass End Get Set(value As clsUserClass) m_clsUserClass = value End Set End Property <TypeConverter(GetType(ExpandableObjectConverter))> _ Public Class clsUserClass Private m_strText As String = "規定値" <DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)> _ <DefaultValue("規定値")> _ Public Property Text() As String Get Return m_strText End Get Set(value As String) m_strText = value End Set End Property End Class End Class
Last updated
September 12, 2013 10:13:42 AM
コメント(0) | コメントを書く |