2017-09-19 4 views
0

J'ai du mal à faire fonctionner le MSDN code sample for the Control.VisibleChanged event: je ne vois pas le MsgBox.Exemple de travail de l'événement Control.VisibleChanged dans vb.net

Private Sub Button_HideLabel(ByVal sender As Object, ByVal e As EventArgs) 
    myLabel.Visible = False 
End Sub 'Button_HideLabel 

Private Sub AddVisibleChangedEventHandler() 
    AddHandler myLabel.VisibleChanged, AddressOf Label_VisibleChanged 
End Sub 'AddVisibleChangedEventHandler 


Private Sub Label_VisibleChanged(ByVal sender As Object, ByVal e As EventArgs) 
    MessageBox.Show("Visible change event raised!!!") 
End Sub 'Label_VisibleChanged 
+2

Avez-vous appelé AddVisibleChangedEventHandler quelque part, dans Form_Load par exemple ? – Benno

Répondre

1

Vous devez "câbler" les événements aux gestionnaires d'événements.

Pour commencer, pour obtenir le code HideLabel_Click appelé, vous en avez besoin pour répondre à un clic sur le bouton "HideLabel".

Il existe deux façons de procéder: vous pouvez utiliser AddHandler ou la clause Handles.

Pour démontrer ce dernier:

Option Strict On 

Public Class Form1 

    Private Sub HideLabel_Click(sender As Object, e As EventArgs) Handles HideLabel.Click 
     myLabel.Visible = False 
    End Sub 

    Private Sub myLabel_VisibleChanged(sender As Object, e As EventArgs) Handles myLabel.VisibleChanged 
     MessageBox.Show("Visible change event raised!!!") 
    End Sub 

End Class 

Cependant, vous remarquerez que le message apparaît même avant que le formulaire apparaît. C'est à cause de ce qui se passe dans les coulisses pour créer le formulaire.

Pour éviter que cela se produise, vous pouvez ajouter le gestionnaire après que le formulaire a été montré:

Option Strict On 

Public Class Form1 

    Private Sub HideLabel_Click(sender As Object, e As EventArgs) Handles HideLabel.Click 
     myLabel.Visible = False 
    End Sub 

    Private Sub myLabel_VisibleChanged(sender As Object, e As EventArgs) 
     MessageBox.Show("Visible change event raised!!!") 
    End Sub 

    Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown 
     AddHandler myLabel.VisibleChanged, AddressOf myLabel_VisibleChanged 
    End Sub 

End Class 

Une autre façon, dans VB2015 et plus tard, est d'utiliser un « lambda expression » au lieu d'une méthode distincte, bien que vous ne pouvez pas dissocier le gestionnaire de l'événement avec RemoveHandler:

était assez aimable
Option Strict On 

Public Class Form1 

    Private Sub HideLabel_Click(sender As Object, e As EventArgs) Handles HideLabel.Click 
     myLabel.Visible = False 
    End Sub 

    Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown 
     AddHandler myLabel.VisibleChanged, Sub() MessageBox.Show("Visible change event raised!!!") 
    End Sub 

End Class 

Craig à [et je cite textuellement] attirer l'attention sur l'importance de Option Strict lorsque vous ajoutez gestionnaire s manuellement en utilisant AddHandler. Sans cela, la "convention déléguée détendue" peut permettre d'ajouter des gestionnaires qui ne correspondent pas exactement à la signature d'événement que vous ne pourrez pas supprimer plus tard. Cela dit, l'option Strict On n'est pas une sauvegarde complète: remarquez comment mon dernier exemple compile et fonctionne même avec la mauvaise méthode de signature pour le gestionnaire.

[Je soupçonne que l'exemple de code MSDN a été créé en C# dans le cadre d'un exemple plus, de sorte que certaines parties ont été perdues dans la traduction et excerption.]

+0

Merci beaucoup, j'espère que vous allez écrire des échantillons pour mdsn, car certains d'entre eux manquent vraiment d'information :) –

+1

Je voudrais attirer l'attention sur l'importance de 'Option Strict' lorsque vous ajoutez des gestionnaires manuellement en utilisant' AddHandler'. Sans cela, la "convention déléguée détendue" peut permettre d'ajouter des gestionnaires qui ne correspondent pas exactement à la signature d'événement que vous ne pourrez pas supprimer plus tard. – Craig

+0

@Craig Ce n'est pas une sauvegarde complète: remarquez comment mon dernier exemple compile et fonctionne même avec la mauvaise méthode de signature pour le gestionnaire. –