|
Hongliang さんと じゃんぬねっと さんの回答を元にして試してみました。
コードは VB でもいいですよね。
Public Class CustomComponent
Private _ContainerControl As ContainerControl
Public Property ContainerControl() As ContainerControl
Get
If _ContainerControl IsNot Nothing Then
Return _ContainerControl
End If
If Me.DesignMode = False Then
Return Nothing
End If
Dim dh As IDesignerHost = Me.GetService(GetType(IDesignerHost))
If dh Is Nothing Then
Return Nothing
End If
_ContainerControl = TryCast(dh.RootComponent, ContainerControl)
Return _ContainerControl
End Get
Set(ByVal value As ContainerControl)
_ContainerControl = value
End Set
End Property
End Class
これで、コンポーネントを Form なり UserControl なりに貼り付けたときに ContainerControl プロパティにコンテナのインスタンスを設定するコードが出力されていました。
こんなに簡単にできるとは驚きです。
一応 ErrorProvider の ContainerControl プロパティがどういう実装になっているかソースを確認したところ、
Site プロパティをオーバーライドし、そこで ContainerControl プロパティを設定するようになっていました。
こんな感じです (あくまでもソースと同様のコードです。引用ではありません) 。
Public Class CustomComponent
Private _ContainerControl As ContainerControl
Public Property ContainerControl() As ContainerControl
Get
Return _ContainerControl
End Get
Set(ByVal value As ContainerControl)
_ContainerControl = value
End Set
End Property
Public Overrides Property Site() As ISite
Get
Return MyBase.Site
End Get
Set(ByVal value As ISite)
MyBase.Site = value
If value Is Nothing Then
Return
End If
Dim dh As IDesignerHost = Me.GetService(GetType(IDesignerHost))
If dh Is Nothing Then
Return
End If
_ContainerControl = TryCast(dh.RootComponent, ContainerControl)
End Set
End Property
End Class
ContainerControl プロパティの Get で設定するのがいいのか
Site プロパティの Set で設定するのがいいのか
どちらが適切かは私には判断できませんが、
このようにして ContainerControl プロパティに設定することができました。
|