420267 ランダム
 HOME | DIARY | PROFILE 【フォローする】 【ログイン】

自宅プログラマーのメモ部屋

September 12, 2013
XML
カテゴリ:カテゴリ未分類
どもです。
タイトルの通り、何も考えないでクラスだけを作ってデザイナでフォームに
そのユーザーコントロールを取り付けても、独自クラス型のプロパティ値が
操作出来なくてちょっとハマッた。色々、とある所に質問してやっと解決。

"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) | コメントを書く



© Rakuten Group, Inc.