2009-07-03 6 views
5

Veuillez lire le message THIS. J'ai le même problème que décrit dans ce post mais j'essaye de faire dans VB.net plutôt que C#. Je suis assez sûr de faire cela, je dois utiliser un événement personnalisé. (J'ai utilisé un code conversion site pour arriver à en apprendre davantage sur les événements personnalisés.) Ainsi, dans l'IDE quand je tapez ce qui suit:Comment exposer et déclencher des événements personnalisés pour un contrôle d'utilisateur winforms vb.net

AddRemoveAttendees sur mesure publique événement EventHandler

il se transforme extrait de code suivant.

Public Custom Event AddRemoveAttendees As EventHandler 
    AddHandler(ByVal value As EventHandler) 

    End AddHandler 

    RemoveHandler(ByVal value As EventHandler) 

    End RemoveHandler 

    RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs) 

    End RaiseEvent 
End Event 

Mais je ne peux pas savoir quoi faire avec. Jusqu'à aujourd'hui, je n'avais jamais entendu parler d'événements personnalisés.

La ligne du bas de ce que je veux est d'avoir l'événement de clic d'une bulle de bouton jusqu'au conteneur du contrôle de l'utilisateur. Je sais que je pourrais envelopper mon propre événement mais j'aimerais au moins comprendre les événements personnalisés avant d'aller plus loin dans cette voie.

Seth

Répondre

7

Pour utiliser des événements personnalisés pour faire barboter les événements d'un autre contrôle, vous pouvez faire comme ceci:

Public Custom Event AddRemoveAttendees As EventHandler 
    AddHandler(ByVal value As EventHandler) 
     AddHandler _theButton.Click, value 
    End AddHandler 

    RemoveHandler(ByVal value As EventHandler) 
     RemoveHandler _theButton.Click, value 
    End RemoveHandler 

    RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs) 
     ' no need to do anything in here since you will actually ' 
     ' not raise this event; it only acts as a "placeholder" for the ' 
     ' buttons click event ' 
    End RaiseEvent 
End Event 

Dans AddHandler et RemoveHandler vous propagez simplement l'appel à attacher ou supprimer l'événement donné gestionnaire vers/depuis l'événement Click du contrôle.

Pour développer un peu sur l'utilisation d'événements personnalisés, voici un autre exemple d'implémentation d'un événement personnalisé:

Dim _handlers As New List(Of EventHandler) 
Public Custom Event AddRemoveAttendees As EventHandler 

    AddHandler(ByVal value As EventHandler) 
     _handlers.Add(value) 
    End AddHandler 

    RemoveHandler(ByVal value As EventHandler) 
     If _handlers.Contains(value) Then 
      _handlers.Remove(value) 
     End If 
    End RemoveHandler 

    RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs) 
     For Each handler As EventHandler In _handlers 
      Try 
       handler.Invoke(sender, e) 
      Catch ex As Exception 
       Debug.WriteLine("Exception while invoking event handler: " & ex.ToString()) 
      End Try 
     Next 
    End RaiseEvent 
End Event 

Maintenant, comme il semble au-dessus, il ne fait guère d'autre qu'une déclaration d'événement régulier:

Il fournit un mécanisme similaire permettant d'attacher et de supprimer des gestionnaires d'événements et de déclencher l'événement. Ce que l'événement personnalisé ajoute est un niveau de contrôle supplémentaire; vous pouvez écrire du code autour de l'ajout, la suppression et la levée de l'événement, dans lequel vous pouvez appliquer des règles, et modifier ce qui va se passer un peu. Par exemple, vous souhaiterez peut-être limiter le nombre de gestionnaires d'événements attachés à votre événement. Pour ce faire, vous pouvez modifier la section AddHandler de l'échantillon ci-dessus:

AddHandler(ByVal value As EventHandler) 
     If _handlers.Count < 8 Then 
      _handlers.Add(value) 
     End If 
    End AddHandler 

Si vous n'avez pas besoin de ce genre de contrôle détaillé, je ne vois pas besoin de déclarer des événements personnalisés.

5

Si vous voulez la même chose que dans l'autre poste que vous mentionnais, voici l'équivalent VB.NET:

Public Custom Event AddRemoveAttendees As EventHandler 

    AddHandler(ByVal value As EventHandler) 
     AddHandler SaveButton.Click, value 
    End AddHandler 

    RemoveHandler(ByVal value As EventHandler) 
     RemoveHandler SaveButton.Click, value 
    End RemoveHandler 

End Event 

Mais je ne pense pas que ce soit une bonne idée, car le paramètre sender de l'événement sera le Button, pas votre UserControl ...

au lieu de cela, vous pouvez vous abonner à l'événement Button.Click et vous élevez propre événement (sans accesseurs explicite)

+0

Merci pour votre réponse ... J'ai donné répondre drapeau à la fi premier poste pour sa minutie, mais a augmenté votre réponse. J'ai décidé d'enrouler le contrôle dans les délégués standard et les événements à l'intérieur du contrôle afin que le contrôle de l'utilisateur émette les événements plutôt que le contrôle de chilc ... selon votre suggestion. Merci. Seth –

Questions connexes