Gestion de l'événement Click dans un FlowLayoutPanel [Résolu]

Phil2Lil 30 Messages postés vendredi 14 juillet 2006Date d'inscription 8 décembre 2011 Dernière intervention - 15 nov. 2011 à 14:49 - Dernière réponse :  Utilisateur anonyme
- 17 nov. 2011 à 13:28
Bonjour,
J'ai développé une apli qui détricote le flux Json issu de l'api allociné. je présente les résultats de la recherche dans une liste constituée de UserControls que j'ajoute, un à un, dans un FlowLayoutPanel.
Mon UserControl se présente comme ça :


A l'exécution la liste se présente comme ça :


Je ne sais pas comment gérer le Click sur cette imbrication de contrôles. Le UserControl est dans un Panel d'un SplitContainer.
SplitContainer1.Panel1 ne possçde pas d'événement Click approprié puisque les UserContrôls sont ajouté au moment de l'éxécution.
Je développe en VB 2010 Express, FrameWork 4.
Voilà l'extrait de code qui me permet de remplir ma liste:
Dim ft(j) As FilmsTrouvés

        FlowLayoutPanel1.SuspendLayout()
        For i As Integer = 0 To j
            Dim ucl As New UserControl_ListeFilms
            ft(i) = New FilmsTrouvés ' Crée une instance
            ft(i).Id i  ' Id 0, 1, 2, etc...
            ' Test l'existance de données
            ' (on est peut-être sur une page de résultats incomplète, la dernière page)
            Try
                ' Mémorise le code du film pour l'extraction de la fiche
                ft(i).Code = data("feed")("movie")(i)("code").ToString()
            Catch ex As Exception
                Exit For
            End Try

            Try
                ft(i).Title = data("feed")("movie")(i)("title")
            Catch ex As Exception
            End Try
            ucl.Lbl_Titre.Text = ft(i).Title
            Try
                ft(i).OriginalTitle = data("feed")("movie")(i)("originalTitle")
            Catch ex As Exception
            End Try
            ucl.Lbl_TitreOriginal.Text = ft(i).OriginalTitle
            Try
                ft(i).ProductionYear = data("feed")("movie")(i)("productionYear").ToString
            Catch ex As Exception
            End Try
            ucl.Lbl_AnnéeProduction.Text = ft(i).ProductionYear
            Try
                ft(i).Directors = data("feed")("movie")(i)("castingShort")("directors")
            Catch ex As Exception
            End Try
            ucl.Lbl_Réalisateur.Text = "de " + ft(i).Directors
            Try
                ft(i).Actors = data("feed")("movie")(i)("castingShort")("actors")
            Catch ex As Exception
            End Try
            ucl.Lbl_Acteurs.Text = "avec " + ft(i).Actors
            Try
                ft(i).Poster_href = data("feed")("movie")(i)("poster")("href")
                ucl.VignetteFilm.Load(ft(i).Poster_href)
            Catch ex As Exception
            End Try
            Try
                ft(i).Link_href = data("feed")("movie")(i)("link")(0)("href")
            Catch ex As Exception
            End Try
            FlowLayoutPanel1.Controls.Add(ucl)
        Next
        FlowLayoutPanel1.ResumeLayout()

FilmsTrouvés est une classe, j'utilise la DLL LitJson trouvée ici : LitJson
Merci de votre aide.
Afficher la suite 

5 réponses

Répondre au sujet
Utilisateur anonyme - 15 nov. 2011 à 19:25
+3
Utile
Salut Phil,
Il faut leur ajouter des Handlers au moment de leur création, exemple d'un textbox:

Private Sub AjouteUntexte()
        Dim TexteTest As TextBox = New TextBox
        Me.Controls.Add(TexteTest)
        AddHandler TexteTest.KeyUp, AddressOf TexteTest_KeyUp
        AddHandler TexteTest.LostFocus, AddressOf TexteTest_LostFocus
        AddHandler TexteTest.GotFocus, AddressOf TexteTest_GotFocus
        AddHandler TexteTest.DoubleClick, AddressOf TexteTest_DbClick
        AddHandler TexteTest.DoubleClick, AddressOf TexteTest_Click
    End Sub
    Private Sub TexteTest_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)

    End Sub
    Private Sub TexteTest_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs)

    End Sub
    Private Sub TexteTest_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs)

    End Sub
    Private Sub TexteTest_DbClick(ByVal sender As Object, ByVal e As System.EventArgs)

    End Sub
    Private Sub TexteTest_Click(ByVal sender As Object, ByVal e As System.EventArgs)

    End Sub



CF2i - Guadeloupe
Ingénierie Informatique
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Utilisateur anonyme
Utilisateur anonyme - 15 nov. 2011 à 20:26
0
Utile
Bonsoir,

Pourquoi tous ces Try ?
Puisque tu connais le nombre de films (j apparemment) pourquoi de pas initialiser ton tableau à j-1 ainsi que ta boucle For Next ?
Commenter la réponse de Utilisateur anonyme
Utilisateur anonyme - 15 nov. 2011 à 20:38
0
Utile
Re:
Oui... surtout que tu ne gères même pas les exceptions.

J'imagine qu'il puisse y avoir des erreurs mais dans ton code tu ne connaitras pas.



CF2i - Guadeloupe
Ingénierie Informatique
Commenter la réponse de Utilisateur anonyme
Phil2Lil 30 Messages postés vendredi 14 juillet 2006Date d'inscription 8 décembre 2011 Dernière intervention - 17 nov. 2011 à 07:48
0
Utile
Merci. Vos conseils m'ont été précieux. Mon soucis était de récupérer l'ID du film de base zéro stocké dans le tableau de structures ft(i).Code où i correspond à la position de l'UserControl dans la liste. J'ai réglé le problème en passant l'index i dans la propriété Tag du bouton.
Comme ceci :
            ucl.ButtonChargerFiche.Tag = i
            FlowLayoutPanel1.Controls.Add(ucl)
            AddHandler ucl.ButtonChargerFiche.Click, AddressOf ButtonChargerFiche_Click

Je le récupère ensuite comme ça :
Public Sub ButtonChargerFiche_Click(ByVal sender As Object, ByVal e As System.EventArgs)
        Dim i As Integer = sender.tag ' Index, ou position du bouton dans la liste des résultats
        Dim CodeFilm As String = ft(i).Code
        Dim Lien_Api As String = "http://api.allocine.fr/rest/v3/movie?" & _
                                 "partner=YW5kcm9pZC12M3M" & _
                                 "&code=" & CodeFilm & _
                                 "&profile=medium" & _
                                 "&format=json" & _
                                 "&filter=movie" & _
                                 "&striptags=synopsis"

Pour ce qui est des try à répétition ils étaient nécessaires pour la phase de développement, pour analyser le comportement de la DLL qui désérialise le flux Json. J'ai remplacé tout ça par un simple On Error Resume Next. Les erreurs rencontrées n'en sont pas. Ce sont tout simplement des données absentes du flus Json, par exemple un film qui n'a pas de titre original.

Voila. Encore merci de votre aide. Dites moi si vous pensez qu'il serait utile que je poste l'apli complète, ne serait-ce que pour démontrer les mécanismes de la désérialisation Json dans un WinForm. De nombreux exemples existent déjà en Java ou en PHP mais n'ayant rien trouvé en VB + WindowsForm, j'ai décidé de m'y intéresser.

On peut considérer le sujet clos (bien que je ne sache pas comment le clore).

Y a t-il un sujet sur le forum qui explique le fonctionnement de cette fenêtre de création de messages ? Vous aurez sans doute remarqué que j'ai tenté d'inclure des images dans mon premier post et que ça n'a pas fonctionné. J'avais cliqué sur le bouton Image, collé l'URL de mon image, mais elles ne sont pas visibles dans le post.
Commenter la réponse de Phil2Lil
Utilisateur anonyme - 17 nov. 2011 à 13:28
0
Utile
Bonjour,

Pour clore le sujet, marque le comme résolu en acceptant la première réponse d'acive. (voir aussi le règlement du forum )

L'emploi de On error resume next (oui j'ai failli m'étouffer avec mon café) est à proscrire car obsolète et inadapté en .NET.
Si tu peux prévoir une erreur à coup sûr, il faut tester une valeur par exemple et agir en conséquence par code.
Si l'erreur peut être imprévisible, la gestion de celle-ci par bloc Try Catch
est indispensable.

Bonne prog.
Commenter la réponse de Utilisateur anonyme

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.