Mon scénario:Raising Events from Interface (win forms)
Windows Forms Application avec une base de base (mdi).
Une interface qui a un événement:
Public Interface IDoSomething
Event AddFilter()
fenêtre Modal implémente l'interface et decalres événement:
Public Class frmPopup Implements IDoSomething
Public Event AddFilter() Implements IDoSomething.AddFilter
Popup contient également le code pour déclencher l'événement:
RaiseEvent AddFilter()
Le masque principal de base contient du code qui détecte et lance des formulaires contextuels qui implémentent un interface spécifiée.
Un formulaire dans l'application lance le popup (qui implémente l'interface) et gère tous les événements qu'il déclenche. J'ai donc le code suivant sous la forme:
Public Class frmMyForm
Public WithEvents m_Popup As IDoSomething
Public Sub m_Popup_AddFilter() Handles m_Popup.AddFilter
MsgBox("I'm in")
End Sub
Le code est tout travail, jusqu'à l'étape où l'événement est déclenché. Le popup se charge sans aucun problème mais quand l'événement se déclenche, il semble tomber de la surface de la terre et n'est pas récupéré par le formulaire principal - frmMyForm. Je soupçonne que cela peut avoir quelque chose à voir avec la façon dont le formulaire popup est lancé à partir du formulaire principal de base via la découverte de l'interface.
CODE ADDITIONNEL - pour développer « forme principale de base contient du code qui découvre et lance formes de pop-up qui mettent en œuvre une interface spécifiée »:
L'idée des formes de pop-up qui sont utilisés est de retourner un objet métier le formulaire qui l'a ouvert en utilisant des événements. Le formulaire contextuel Interface (IDoSomething) hérite d'une autre interface - IBusinessObjectSelector qui spécifie que le formulaire renverra un objet métier.
Ainsi la fonction sous la forme principale de base est:
Public Function GetBusinessObjectUsingPopup(Of O, F As IBusinessObjectSelector)
(ByRef dicPropertyValues As Dictionary(Of String, Object),
Optional ByVal titleText As String = "")
As O Implements IBaseMasterForm.GetBusinessObjectUsingPopup
Dim objBusinessObjectSelector As IBusinessObjectSelector = GetPopup(Of F)(False)
objBusinessObjectSelector.InitialiseForm()
' Activate and show the dialog
If objBusinessObjectSelector.ShowPopup() <> Windows.Forms.DialogResult.OK Then
' The user cancelled the load, so just exit
Return Nothing
End If
GetBusinessObjectUsingPopup = CType(objBusinessObjectSelector.SelectedBusinessObject, O)
End Function
et le code Popup:
Public Function GetPopup(Of F As IBasePopupChildForm)
(Optional ByVal initialisePopupPriorToReturn As Boolean = True) As F
Implements IBaseMasterForm.GetPopup
Dim lstIBasePopupChildForm As List(Of F) = GetInterfaces(Of F)()
lstIBasePopupChildForm(0).MyIBaseMasterForm = Me
If initialisePopupPriorToReturn Then
lstIBasePopupChildForm(0).InitialiseForm()
End If
Return lstIBasePopupChildForm(0)
End Function
Remarque - GetInterfaces (F)() scanne simplement l'assemblage et retourne une liste de formulaires qui implémentent l'interface requise. Une validation a été supprimée qui renvoie des messages si plusieurs formulaires implémentant l'interface sont trouvés.
Merci pour votre réponse, j'ai ajouté du code supplémentaire ci-dessus pour essayer de montrer comment le popup est lancé, j'espère que cela le rendra un peu plus clair. – Tanner
Je ne vous vois toujours pas attribuer le membre m_Popup. –
Juste pour vous mettre à jour sur la progression, votre commentaire sur l'attribution de m_Popup est valide et il n'y a pas de retour au formulaire d'ouverture d'origine pour lier les événements. Il est actuellement signalé comme un bug, donc quand j'y arriverai et que je mettrai en place un correctif, je mettrai à jour l'affichage et vous créditerai. Merci – Tanner