2009-02-17 4 views
1

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.

Répondre

3

La partie critique initialise correctement m_Popup. Vous n'avez rien dit à ce sujet. Quelques exemples de code:

Form2:

Public Class Form2 
    Implements IDoSomething 
    Public Event AddFilter() Implements IDoSomething.AddFilter 

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
     RaiseEvent AddFilter() 
    End Sub 
End Class 

Public Interface IDoSomething 
    Event AddFilter() 
End Interface 

Form1:

Public Class Form1 
    Private WithEvents mPopup As IDoSomething 

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
     Dim f2 As New Form2 
     f2.Show(Me) 
     mPopup = f2 
    End Sub 

    Private Sub mPopup_AddFilter() Handles mPopup.AddFilter 
     MsgBox("yada") 
    End Sub 
End Class 

La déclaration mPopup = f2 dans ce code est la clé.

+0

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

+0

Je ne vous vois toujours pas attribuer le membre m_Popup. –

+0

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