Control Container Problems
I don't have much experience creating custom controls and the like so please bear with me.
I have a BaseControl which, for now, Inherits from a Label. I am extending a label by adding a collection of BaseControls (BaseControlCollection). This is a strong type collection inherited from CollectionBase.
In the property browser the BaseControls property of my BaseControl shows up properly and I can open the CollectionEditor and create BaseControls. When I accept changes and close down the CollectionEditor i notice the new 'SubItems' of BaseControl is listed in the InitializeComponents sub of the form. However, there is no calls to add the sub items to the root BaseControls collection of BaseControls. Ie.. There isn't a call like:
Me.BaseControl1.BaseControls.AddRange({Me.BaseControl2, Me.BaseControl3, etc...})
What am I missing? What am I doing wrong?
Here is the code (BaseControl and BaseControlCollection):
Imports System.ComponentModel.Design
Imports System.ComponentModel
Imports System.Drawing.Design
Public Class BaseControl
Inherits Label
Private _baseControls As BaseControlCollection
_
Public Property BaseControls() As BaseControlCollection
Get
If _baseControls Is Nothing Then
_baseControls = CreateBaseControlCollection()
End If
Return _baseControls
End Get
Set(ByVal Value As BaseControlCollection)
_baseControls = Value
End Set
End Property
Protected Overridable Function CreateBaseControlCollection() As BaseControlCollection
Return New BaseControlCollection(Me)
End Function
End Class
Public Class BaseControlCollection
Inherits CollectionBase
Public Event Changed As EventHandler
Public Sub OnChanged(ByVal e As EventArgs)
RaiseEvent Changed(Me, e)
End Sub
Private _owner As BaseControl
Public Sub New(ByVal Owner As BaseControl)
_owner = Owner
End Sub
Default Public Property Item(ByVal Index As Integer) As BaseControl
Get
Return CType(MyBase.List, BaseControl)
End Get
Set(ByVal Value As BaseControl)
MyBase.List(Index) = Value
OnChanged(EventArgs.Empty)
End Set
End Property
Public Function Add(ByVal o As BaseControl) As Integer
Return MyBase.List.Add(o)
OnChanged(EventArgs.Empty)
End Function
Public Sub AddRange(ByVal c As ICollection)
MyBase.InnerList.AddRange(c)
OnChanged(EventArgs.Empty)
End Sub
Public Sub AddRange(ByVal c() As BaseControl)
MyBase.InnerList.AddRange(c)
OnChanged(EventArgs.Empty)
End Sub
Public Sub Insert(ByVal Index As Integer, ByVal o As BaseControl)
MyBase.List.Insert(Index, o)
OnChanged(EventArgs.Empty)
End Sub
Public Sub Remove(ByVal o As BaseControl)
MyBase.List.Remove(o)
OnChanged(EventArgs.Empty)
End Sub
Public Sub CopyTo(ByVal dest As Array, ByVal index As Integer)
MyBase.List.CopyTo(dest, index)
End Sub
'Public Sub Clear()
' MyBase.Clear()
'End Sub
'Public Sub RemoveAt(ByVal Index As Integer)
' 'MyBase.RemoveAt(Index)
' 'MyBase.InnerList.RemoveAt(Index)
' 'OnChanged(EventArgs.Empty)
'End Sub
'Public Overloads Overrides Function GetEnumerator() As IEnumerator
' Return MyBase.GetEnumerator
'End Function
'Public ReadOnly Property Count() As Integer
' Get
' Return MyBase.Count
' End Get
'End Property
Public ReadOnly Property IsReadOnly() As Boolean
Get
Return MyBase.List.IsReadOnly
End Get
End Property
Public ReadOnly Property IsFixedSize() As Boolean
Get
Return MyBase.List.IsFixedSize
End Get
End Property
Public ReadOnly Property IsSyncronized() As Boolean
Get
Return MyBase.List.IsSynchronized
End Get
End Property
Public ReadOnly Property SyncRoot() As BaseControlCollection
Get
Return Me
End Get
End Property
Public ReadOnly Property IndexOf(ByVal o As BaseControl) As Integer
Get
Dim i As Integer = -1
For Each itm As BaseControl In MyBase.List
i += 1
If itm.Name = o.Name Then
Exit For
End If
Next
Return i
End Get
End Property
Public ReadOnly Property Contains(ByVal o As BaseControl) As Boolean
Get
For Each itm As BaseControl In MyBase.List
If itm.Name = o.Name Then
Return True
End If
Next
End Get
End Property
End Class