2009-09-13 9 views
0

événement très simple j'ai un objet Order avec un événement simple,ASP.NET: manipulation ne fonctionne pas

Public Event ErrorOccurred(ByVal msg As String) 

que je soulève dans le constructeur comme alors quand un ordre ne peut pas être trouvé (le long w/la fixation d'un booléen indicateur d'erreur:

RaiseEvent ErrorOccurred("This order does not exist in the database.") 
[Error] = True 

J'ai un formulaire en ligne souscrit à l'événement ErrorOccurred de l'ordre:

Public WithEvents o As New Order 

et I ont une méthode de gestionnaire d'erreur sur la forme:

Private Sub OnErrorOccurred(ByVal msg As String) Handles o.ErrorOccurred 
    litMsg.Text = "<p class=""error-confirm"">" & msg & "</p>" 
End Sub 

Quand une zone de texte est modifié, il autoposts retour à la page et utilise la logique suivante:

Private Sub txtOrderID_TextChanged(ByVal sender As Object,_ 
ByVal e As System.EventArgs) Handles txtOrderID.TextChanged 
    If IsNumeric(txtOrderID.Text) Then 
    If o.OrderID = 0 Then o = New Order(txtOrderID.Text) 
     If Not o.Error Then 
     'do stuff' 
     Else 
     'error, run error handling' 
     End If 
     .... 

Lorsqu'il y a une erreur (lorsque la logique Else est exécutée), tout se déroule normalement, sauf que l'événement ne se déclenche pas. Cependant, puisque l'indicateur Error est défini sur true, cela signifie que l'événement DOIT avoir été déclenché, car cette ligne s'exécute APRÈS la ligne RaiseEvent.

J'ai essayé tout ce que je peux penser, mais je ne peux pas comprendre ce qui pourrait être faux. J'ai des événements éparpillés partout dans mon projet et ils fonctionnent tous bien en utilisant pratiquement la même structure. Que pourrais-je faire mal ici?

Répondre

2

Je dirais que puisque vous relancez l'événement dans le constructeur, avant même d'avoir une référence à l'objet dans votre classe parente, vous ne pouvez pas gérer l'événement. Dans ce cas, en particulier avec des erreurs dans le constructeur, il serait probablement préférable de lancer une exception plutôt que de déclencher un événement. Je ferais mieux de lancer une exception, car un autre code appelant votre classe pourrait même ne pas gérer l'événement, et vous voudriez probablement savoir qu'une erreur est survenue. Lancer des exceptions est la manière standard de faire savoir au code appelant qu'une erreur est survenue. Les événements sont plus pour des choses facultatives que la classe appelante peut vouloir gérer, mais qu'elle peut également vouloir ignorer.

+0

est-ce que dire que vous ne pouvez pas vraiment déclencher des événements dans le constructeur? – Jason

+0

merci ... c'était vraiment utile – Jason

+0

C'est exact, au moins la façon dont vous l'avez codé. La seule façon de l'obtenir pour gérer un événement du constructeur est de passer une référence à l'appelant, de l'appelé, et d'ajouter l'explicitation du gestionnaire d'événements, avant que l'événement ne soit lancé. – Kibbee