- PR -

VB.NET2003 プロパティの作成方法

投稿者投稿内容
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-08 14:26
引用:

yamayamaさんの書き込み (2006-03-08 14:16) より:

何かおかしな点などございましたら
ご指摘のほどよろしくお願いします。


これでは永続的に保持されないと思います。

コレクション エディタで Members にアイテムを加えてから、
デザイナを閉じ、再度デザイナを表示して Members プロパティの中身を確認してみてください。

保持されていないかと思います。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
yamayama
ベテラン
会議室デビュー日: 2006/02/10
投稿数: 68
投稿日時: 2006-03-08 15:08
引用:


じゃんぬねっとさんの書き込み(投稿日時: 2006-03-08 14:26)
コレクション エディタで Members にアイテムを加えてから、
デザイナを閉じ、再度デザイナを表示して Members プロパティの中身を確認してみてください。



(コレクション エディタで Members にアイテムを加えてから、
デザイナを閉じ、再度デザイナを表示して Members プロパティの中身を確認)
この場合は値が保持されているのですが、
プロジェクトを立ち上げなおすと値がクリアされていることが
分かりました。
MyMemberCollectionクラスに
コード:
 Public Overloads Sub AddRange(ByVal obj() As Object)
        MyBase.AddRange(obj)
 End Sub


を追加してもうまくいきません。
他に理由があるのでしょうか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-08 15:16
引用:

yamayamaさんの書き込み (2006-03-08 15:08) より:

(コレクション エディタで Members にアイテムを加えてから、
デザイナを閉じ、再度デザイナを表示して Members プロパティの中身を確認)
この場合は値が保持されているのですが、
プロジェクトを立ち上げなおすと値がクリアされていることが分かりました。


デザイナを閉じてしまえば、すぐメモリから消え去りそうですが...
本題じゃないのでどうでも良いことですね。

引用:

を追加してもうまくいきません。
他に理由があるのでしょうか?


値を保持するための機構がないように思えます。
そのひとつが「DesignerSerializationVisibility 属性」だったのですが...

引用:

DesignerSerializationVisibility 属性についてはなんとなく理解できましたが


と、仰ってましたけども、出来上がったソースを見る限り含まれていません。
それとも、何か異なる方法を発見して試そうとしたのでしょうか?

# リンク先は読まれましたよね?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
yamayama
ベテラン
会議室デビュー日: 2006/02/10
投稿数: 68
投稿日時: 2006-03-08 15:41
引用:

じゃんぬねっとさんの書き込み(投稿日時: 2006-03-08 15:16)




すみません。コードを抜粋したため、コードの記述を削除してました。_(--)_

DesignerSerializationVisibility 属性はこちらのコードには、
は挿入しております。

この場合に、
プロジェクトを立ち上げなおすと値がクリアされてしまいます。

じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-08 16:05
引用:

yamayamaさんの書き込み (2006-03-08 15:41) より:

すみません。コードを抜粋したため、コードの記述を削除してました。_(--)_
DesignerSerializationVisibility 属性はこちらのコードには、は挿入しております。


それはよろしいのですが、肝心な属性が "どのメンバについているのか" がわからないですよね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
yamayama
ベテラン
会議室デビュー日: 2006/02/10
投稿数: 68
投稿日時: 2006-03-08 16:37
あらためてコードを記述させていただきます。
MyMemberCollection部分に属性を付加しています。

コード:
 
Public Class myControl
    Inherits System.Windows.Forms.ComboBox

    'この部分をつけたした場合、うまく動作する事が分かりました。●●●●●●●●
    Private components As System.ComponentModel.Container = Nothing
        
    Private Sub InitializeComponent()
        components = New System.ComponentModel.Container
    End Sub
    
#Region "コンストラクタ"
    Public Sub New(ByVal container As System.ComponentModel.IContainer)
        MyBase.new()
        container.Add(Me)
        InitializeComponent()
        myMembers = New MyMemberCollection
    End Sub

    Public Sub New()
        InitializeComponent()
        myMembers = New MyMemberCollection
    End Sub
#End Region
    'ここまで●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
    
    Private myMembers As MyMemberCollection
'★★★★★この部分に属性付加★★★★★★★★★★★★★★★★★★★★★★★★★
 <DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _
    Public Property Members() As MyMemberCollection
        Get
            Return myMembers
        End Get
        Set(ByVal Value As MyMemberCollection)
            myMembers = Value
        End Set
    End Property
End Class

#Region "MyMemberクラス"

Public Class MyMember

#Region "インスタンス変数"
    Private myMemberName As String
    Private myByteSize As Integer
    Private myPenColor As Color
#End Region

#Region "プロパティ"
<DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _
#Region "Public Property MemberName() As String"
    Public Property MemberName() As String
        Get
            Return myMemberName
        End Get
        Set(ByVal Value As String)
            myMemberName = Value
        End Set
    End Property
#End Region

#Region "Public Property ByteSize() As Integer"
    Public Property ByteSize() As Integer
        Get
            Return myByteSize
        End Get
        Set(ByVal Value As Integer)
            myByteSize = Value
        End Set
    End Property
#End Region

#Region "Public Property PenColor() As Color"
    Public Property PenColor() As Color
        Get
            Return (Me.myPenColor)
        End Get
        Set(ByVal Value As Color)
            Me.myPenColor = Value
        End Set
    End Property
#End Region

#End Region

End Class

#End Region

#Region "MyMemberCollectionクラス"

Public Class MyMemberCollection
    Inherits System.Collections.ArrayList
    Default Public Shadows Property Item(ByVal Index As Integer) As MyMember
        Get
            Return DirectCast(MyBase.Item(Index), MyMember)
        End Get
        Set(ByVal Value As MyMember)
            MyBase.Item(Index) = DirectCast(Value, MyMember)
        End Set
    End Property
End Class
#End Region

 



上記の様になっております。
よろしくお願いします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-09 14:49
引用:

yamayamaさんの書き込み (2006-03-08 16:37) より:

あらためてコードを記述させていただきます。
MyMemberCollection部分に属性を付加しています。


このコードだとコンパイル自体が通らなかったので、いくつか訂正して検証しました。

引用:

Public Class MyMember


バイナリ シリアライズするのであれば、System.Serializable 属性が必要です。
おそらく、これで保持はできるようになるでしょう。

引用:

<DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _
Public Property MemberName() As String


ここに属性は必要ないと思います。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-09 14:56
付け足しです。

引用:

yamayamaさんの書き込み (2006-03-08 16:37) より:

Public Class MyMemberCollection


こちらのコレクション クラスに MyMember の配列を引数とした AddRange メソッドを実装すると、
InitializeComponent メソッドで自動生成されるコードに AddRange メソッドが使われるようになります。

AddRange メソッドの方がパフォーマンスが良かったり、1 行で書いてくれたりという利点があります。
まあ、それを抜きにしても、コード側から利用するにおいて便利なので実装した方が良いでしょう。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

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