Hello folks,
First sorry my bad english.
I will try to implement a IExtenderProvider + Verbs (Designer). When
compile tha follow code its compile fine, but whem drag resulting
componet under form i gain a error: Specified Cast Is Not Valid :(
Code.
#Region "NameSpaces Area"
Imports System.ComponentModel
Imports System.Drawing
Imports System.Windows.Forms
Imports System.Windows.Forms.Design
Imports System.ComponentModel.Design
#End Region
<Designer(GetType(ClickEventProviderDesigner)),
ProvideProperty("MenuItem", GetType(ToolBarButton)), _
Description("Associa um evento de Click a um ToolBarButton."), _
Category("Eventos")> _
Public Class ClickEventProvider
Inherits Component
Implements IExtenderProvider
Private _Collection As New Hashtable()
#Region "Implements Area"
Public Function CanExtend(ByVal Extendee As Object) As Boolean _
Implements IExtenderProvider.CanExtend
' Habilita a funcionalidade somente para objetos ToolBarButton
Return TypeOf Extendee Is ToolBarButton
End Function
#End Region
#Region "ProvideProperty Area"
Public Function GetMenuItem(ByVal Button As ToolBarButton) As
MenuItem
' Retorna o objeto extendido caso exista na Collection. (
Run-Time )
If (_Collection.Contains(Button)) Then
Return CType(_Collection(Button), MenuItem)
Else
Return Nothing
End If
End Function
Public Sub SetMenuItem(ByVal Button As ToolBarButton, ByVal Item
As MenuItem)
' Param Button: Informa o botao que disparara o evento
' Param Item : Informa qual MenuItem devera ser chamado ao
clicar.
' Caso nao tenha um Item associado sai do metodo
If Item Is Nothing Then
' Eh preciso remover o Handler ou o evento sera disparado
duas vezes ;-}
RemoveHandler Button.Parent.ButtonClick, AddressOf
ToolbarHandler
Exit Sub
End If
' Caso o botao ja esteja contido na Collection (_Collection) o
mesmo sera alterado
' caso ainda nao esteja na Collection sera adicionado
If (_Collection.Contains(Button)) Then
_Collection(Button) = Item
Else
_Collection.Add(Button, Item)
AddHandler Button.Parent.ButtonClick, AddressOf
ToolbarHandler
End If
End Sub
#End Region
#Region "Private Methods"
Private Sub ToolbarHandler(ByVal Sender As Object, ByVal e As
ToolBarButtonClickEventArgs)
If (_Collection.Contains(e.Button)) Then
' Recupera o MenuItem associado ao botao e "dispara" o
click
CType(_Collection(e.Button), MenuItem).PerformClick()
End If
End Sub
#End Region
End Class
Public Class ClickEventProviderDesigner
Inherits ControlDesigner
Public Overrides ReadOnly Property Verbs() As
DesignerVerbCollection
Get
Return New DesignerVerbCollection(New DesignerVerb() {New
DesignerVerb("About", AddressOf AboutHandler)})
End Get
End Property
Private Sub AboutHandler(ByVal sender As Object, ByVal e As
System.EventArgs)
Dim About As String = _
"ToolBarButton Click Event Provider." & vbCrLf & _
"Copyright © 2003-2004." & _
"All Rights Reserved." & vbCrLf & _
"Genival Pereira de Carvalho."
MessageBox.Show(About, "About", _
MessageBoxButtons.OK, MessageBoxIcon.Information)
End Sub
End Class
Regards
Carvalho Genival
Japan