- 題名: 子コントロール(又はコンポーネント)のイベントを継承する
- 日時: 2009/01/19 18:23:51
- ID: 23826
- この記事の返信元:
- (なし)
- この記事への返信:
- [23833] Re[1]: 子コントロール(又はコンポーネント)のイベントを継承する2009/01/20 12:01:12
- ツリーを表示
ちなみにですが、
以下のソースで試してみました。
Imports System.ComponentModel
Public Class Component1
<DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _
Public ReadOnly Property BSource() As BindingSource
Get
Return Me.BindingSource1
End Get
End Property
End Class
そこで、コンパイル後ツールボックスからフォームへドロップ、プロパティの入力は出来たのだが、イベントを入力・・・で、エラーです。
そこで、フォームデザイナ.vbで入力したプロパティ値を確認してみたが、記述がない。
保存して、ソリューションのクリーンをして、開き直して、プロパティウィンドウで先のプロパティの値を確認してみると残っていなかった。
・・・
とすると、
・・・
<Editor(GetType(TestCollectionEditor), GetType(System.Drawing.Design.UITypeEditor))> _
のような属性&クラスが必要なのでしょうか?
魔界の仮面弁士さん度々有難う御座います。
ちなみに手書き実装も、試行してみました。
Public Class Component1
Private _BSource2 As New BindingSource
<DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _
Public ReadOnly Property BSource2() As BindingSource
Get
Return _BSource2
End Get
End Property
End Class
こちらも同様に、実装できました。
(プロパティ値もデザイナファイルに書き込まれていました)
・・とすると、「共通点は?」と考えると
Partial Class Form1
Private Sub InitializeComponent()
:
Me.Component11 = New Sample20090120.Component1(Me.components)
:
End Sub
End Class
Property BSource() As BindingSource
:
Me.components.Remove(Me.BindingSource1)
:
End Property
とする点では、コンポーネントに乗っかっているコントロール所有しない?
つまりイベントを継承する場合「継承するものは乗っけない」とする所でしょうか・・・
推測ですが・・
デザイナでプロパティウィンドでイベント登録しようとすると、
VS2005では・・
その所有者(実装先)のソースを探しに行こうとするが"Form1.vb"と"Component1.vb"のどっちに?
でエラーとなる?
でも・・・、じゃぁプロパティも一緒では?という疑問も出てきます。
("Component1.vb"でプロパティ定義してるから"Form1.Designer.vb"にコーディングする。・・謎は深まるばかりです。)
ちなみに、私の方ではコンストラクタにてコンポーネントを破棄する様にしました。
'<System.Diagnostics.DebuggerNonUserCode()> _
Public Sub New()
MyBase.New()
'この呼び出しは、コンポーネント デザイナで必要です。
InitializeComponent()
Me.components.Remove(Me.BindingSource1)
End Sub
ところで実装先がDisposeする時、ちゃんと解放してくれているのか?
と気になります。
一応、なにが足りないのか?正式な方法があるのか?調査を続けてみます。
以下の構造図の様に、更にネストした構造で試しました。
ネストできるイベントの階層としては孫までのようです。
構造図
Form1
└ Public Class Component1
└ Public Class cmp0
└ BindingSource1
--------------------------------------------------------------------------------
以下、コード。
Imports System.ComponentModel
Public Class cmp0
Implements ISupportInitialize
Public Event NameChanged(ByVal sender As Object, ByVal e As System.EventArgs)
Public Event AddingNew(ByVal sender As System.Object, ByVal e As System.ComponentModel.AddingNewEventArgs)
Private _Name As String
Public Property Name() As String
Get
Return _Name
End Get
Set(ByVal value As String)
If _Name = value Then Exit Property
RaiseEvent NameChanged(Me, New EventArgs)
_Name = value
End Set
End Property
<DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _
Public ReadOnly Property BSource() As BindingSource
Get
Return Me.BindingSource1
End Get
End Property
'<System.Diagnostics.DebuggerNonUserCode()> _
Public Sub New()
MyBase.New()
'この呼び出しは、コンポーネント デザイナで必要です。
InitializeComponent()
Me.components.Remove(Me.BindingSource1)
End Sub
Public Sub BeginInit() Implements ISupportInitialize.BeginInit
_Name = ""
End Sub
Public Sub EndInit() Implements ISupportInitialize.EndInit
End Sub
Private Sub BindingSource1_AddingNew(ByVal sender As System.Object, ByVal e As System.ComponentModel.AddingNewEventArgs) Handles BindingSource1.AddingNew
RaiseEvent AddingNew(Me, New AddingNewEventArgs)
End Sub
End Class
Public Class Component1
'<System.Diagnostics.DebuggerNonUserCode()> _
Public Sub New()
MyBase.New()
'この呼び出しは、コンポーネント デザイナで必要です。
InitializeComponent()
Me.components.Remove(Me.Cmp01)
End Sub
<DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _
Public ReadOnly Property cmp() As cmp0
Get
Return Me.Cmp01
End Get
End Property
End Class
Public Class Form1
Private Sub Component11_cmp_NameChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Component11.cmp.NameChanged
MsgBox("Component11_cmp_NameChanged->" & Me.Component11.Cmp01.Name)
End Sub
Private Sub Component11_cmp_AddingNew(ByVal sender As System.Object, ByVal e As System.ComponentModel.AddingNewEventArgs) Handles Component11.cmp.AddingNew
MsgBox("Component11_cmp_AddingNew")
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Me.Component11.Cmp01.BSource.AddNew()
Me.Component11.Cmp01.Name = "123"
End Sub
End Class
とりあえず、解決とさせて頂きます。
魔界の仮面弁士さん、有難う御座いました。
分類:[.NET]
SplitContainerコントロールのプロパティ(イベントタブ)ウィンドウで、 SplitContainer.Panel1.Enter
といった、階層構造を持つイベント項目を作成したいのですが、Googleって見ましたが見当たりません。
(検索方法が悪いのカモですが・・)
現在、子コントロールまたは子フォームのイベントを親コンポーネントがキャッチして、そのまま親コンポーネントはOwnerへRaiseEventで通知しております。
これを、
@プロパティ(イベントタブ)ウィンドウで、イベント処理を定義し、
A親コンポーネントを介さずに、Ownerでイベントをキャッチし処理
を行なえる様にしたい。
(今後、各子フォームで機能追加しても親コンポーネントに影響させない様に)
と思っております。
何卒、ご教授宜しくお願い致します。