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

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

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

Re[2]: カスタムコントロールにコレクションのプロパティを設定したい


(過去ログ 79 を表示中)

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

■46744 / inTopicNo.1)  カスタムコントロールにコレクションのプロパティを設定したい
  
□投稿者/ たぁくん (1回)-(2010/02/10(Wed) 10:25:15)

分類:[.NET 全般] 

開発環境:VB.NET 2005

カスタムコントロールを作成しています。
その中で、自作コレクションのプロパティを作成しています。
以下の(MyControl.vb)コードを追加し、コンパイルし、Form1に貼り付けるところまでは良いのですが、
MyControl1 のプロパティ MyItems のコレクションエディタで追加を行うと、
Form1.Desiner.vbに生成されるコードが、エラーとなってしまいます。
具体的には、
New WindowsApplication3.MyControl.MyItemCollection.Add(MyItem1)です。
↓このようなコードが生成されることを期待していたのですが、うまくいきません。
Me.MyControl1.MyItems.Add(MyItem1)

どこが間違っているのか、なにかの属性等の追加が必要なのか、
ご教授いただきたくお願いします。

[Form1.Desiner.vb のInitializeComponent()抜粋]
    <System.Diagnostics.DebuggerStepThrough()> _
    Private Sub InitializeComponent()
        Dim MyItem1 As WindowsApplication3.MyItem = New WindowsApplication3.MyItem
        Me.MyControl1 = New WindowsApplication3.MyControl
        Me.SuspendLayout()
        '
        'MyControl1
        '
        Me.MyControl1.Location = New System.Drawing.Point(43, 55)
        MyItem1.Value = 0
New WindowsApplication3.MyControl.MyItemCollection.Add(MyItem1)
        Me.MyControl1.Name = "MyControl1"
        Me.MyControl1.Size = New System.Drawing.Size(192, 152)
        Me.MyControl1.TabIndex = 0
        Me.MyControl1.Text = "MyControl1"
        '
        'Form1
        '
        Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 12.0!)
        Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
        Me.ClientSize = New System.Drawing.Size(292, 266)
        Me.Controls.Add(Me.MyControl1)
        Me.Name = "Form1"
        Me.Text = "Form1"
        Me.ResumeLayout(False)
    End Sub


[MyControl.vb]
Public Class MyControl
    Public Class MyItemCollection
        Inherits System.Collections.CollectionBase

        Public Sub Add(ByVal LotItem As MyItem)
            List.Add(LotItem)
        End Sub

        Public ReadOnly Property Item(ByVal index As Integer) As MyItem
            Get
                Return CType(List.Item(index), MyItem)
            End Get
        End Property
    End Class

    Private _MyItems As New MyItemCollection

    Public Property MyItems() As MyItemCollection
        Get
            Return _MyItems
        End Get
        Set(ByVal value As MyItemCollection)
            _MyItems = value
        End Set
    End Property


    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        MyBase.OnPaint(e)

        'カスタム描画コードをここに追加します。
    End Sub
End Class

Public Class MyItem
    Private _value As Integer = 0

    Public Property Value() As Integer
        Get
            Return _value
        End Get
        Set(ByVal value As Integer)
            _value = value
        End Set
    End Property
End Class

引用返信 編集キー/
■46748 / inTopicNo.2)  Re[1]: カスタムコントロールにコレクションのプロパティを設定したい
□投稿者/ Hongliang (558回)-(2010/02/10(Wed) 11:04:43)
方法1:MyItems プロパティを ReadOnly にする
方法2:MyItems プロパティに DesignerSerializationVisibility.Content をもったDesignerSerializationVisibility 属性を付ける

コレクション型プロパティは ReadOnly にすることが多いと思います。
引用返信 編集キー/
■46758 / inTopicNo.3)  Re[2]: カスタムコントロールにコレクションのプロパティを設定したい
□投稿者/ たぁくん (3回)-(2010/02/10(Wed) 12:23:09)
No46748 (Hongliang さん) に返信
> 方法1:MyItems プロパティを ReadOnly にする
> 方法2:MyItems プロパティに DesignerSerializationVisibility.Content をもったDesignerSerializationVisibility 属性を付ける
>
> コレクション型プロパティは ReadOnly にすることが多いと思います。

Hongliang さんありがとうございました。
方法2で無事に解決しました。

方法1の ReadOnly にするだけだと、
デザイン時に追加した内容は、Form1.Desiner.vbには、自動生成されないのですね。
MyItemクラス宣言もAddもされていないので、コンパイルすれば消えてしまいます。

<DesignerSerializationVisibility(DesignerSerializationVisibility.Content)>
を追加することによって、MyItemクラス宣言とAddのコードが生成されました。
宣言の意味は、これから勉強したいと思います。

> コレクション型プロパティは ReadOnly にすることが多いと思います。
たしかに、ReadOnlyで機能は満足できますし、Getする必要性もあまりないですね。

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


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

このトピックに書きこむ

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

管理者用

- Child Tree -