2017-07-05 4 views
-1

私はカスタムFlowLayoutPanelを持っています: "AlbumFlowLayout"は、FlowLayoutPanelから継承し、UserControls( "AlbumItems")のコレクションを保持するために使用されます。サブコントロールのインスタンス化時にイベントハンドラを追加する

Form ("FrmMain") 
    AlbumFlowLayout ("AlbumFlowLayout1") 
    AlbumItems (1 or more) 

作成AlbumItemに「WasClicked」ハンドラを追加するための[ありの方法/プロトコルが何である]:項目の階層があるように、一般的に、これはフォーム(「FrmMain」)上に存在しますそれが作成/ AlbumFlowLayoutに追加されるたびに?

理想的には、FrmMainのコードが新しいAlbumItemのAlbumFlowLayout.Controls.Addを実行するたびに自動的に発生するように、FrmMainの中に2行目を追加するのではなく、自動的に発生するようにハンドラー構造コードをAlbumFlowLayout内にカプセル化したいコントロールを追加する前のハンドラー。例:

Dim myItem As New AlbumItem 

AddHandler myItem.WasClicked, AddressOf AlbumFlowLayout1.AlbumItem_WasClicked 
AlbumFlowLayout1.Controls.Add(myItem) 

ありがとう! -ペテ

+0

コンテナコントロールには、ワイヤリングできる「ControlAdded」イベントが含まれています。 *自動であるかどうかわからない* – Plutonix

+0

パーフェクト!それがまさに私が必要としていたものです。もしあなたが好きなら、回答を回答として追加してください。私はそれを正しいものとしてマークします。 – pbickford

答えて

0

プルトニックス(Plutonix)が溶液を有していた。

Partial Public Class AlbumFlowLayout 
    Inherits FlowLayoutPanel 

    ' A FlowLayoutPanel for handling collections of AlbumItems 

    Public SelectedItems As New List(Of String) 
    ' Holds IDs of currently selected items 


    Private Sub AlbumFlowLayout_ControlAdded(sender As Object, e As ControlEventArgs) Handles Me.ControlAdded 
    ' Wire up each user item as it's added so that it will pass its 
    ' Wasclicked up to here 

    Dim myAlbumItem As AlbumItem = e.Control 
    AddHandler myAlbumItem.WasClicked, AddressOf Me.AlbumItem_WasClicked 
    End Sub 

    ' Other methods... 
    ' ... 

    Public Sub AlbumItem_WasClicked(ByVal sender As Object, e As EventArgs) 
    ' Deselects all previously selected items. Doing this via a List to 
    ' Allow for expansion item where we permit multi-selection via 
    ' Control-key or the like; currently is single-select 

    Dim myItem As AlbumItem = sender 

    For Each itm As String In SelectedItems 
     If itm <> myItem.Name Then 
      DirectCast(Me.Controls(itm), AlbumItem).IsSelected = False 
     End If 
    Next 

    SelectedItems.Clear() 
    SelectedItems.Add(myItem.Name) 
    End Sub 
End Class 
関連する問題