[VB.NET] Suppression d'un UserControl dynamiquement

Signaler
Messages postés
9
Date d'inscription
lundi 14 juillet 2003
Statut
Membre
Dernière intervention
13 août 2006
-
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
-
Bonjour à tous,

J'essaie de créer un formulaire dynamiquement, à partir d'un usercontrol.
J'ai une page "Main" possédant un Panel et un bouton Ajouter. A chaque clic sur ce bouton, un UserControl s'ajoute à mon Panel.
Chaque UserControl est composé d'une textbox et d'un bouton "Supprimer", qui aurait pour fonction de... supprimer le UserControl du Panel.

Scénario classique: j'ajoute quelques usercontrols en cliquant sur le 1er bouton, je remplis ensuite quelques textbox... et je supprime un de ces usercontrols... Malheureusement, je n'arrive pas à maitriser cet événement: essayez vous-même, ma procédure ne supprime pas toujours le Usercontrol voulu... D'ailleurs, elle ne supprime pas toujours un Usercontrol tout court!!!
Pourtant j'ai bombardé de msgbox pour m'afficher les valeurs de mes variables à certains moments stratégiques...

Voilà un copier-coller de mon code:

Fichier AlbumNouveau.aspx:
<%@ Page Language= "VB" AutoEventWireup="false" CodeFile="AlbumNouveau.aspx.vb" Inherits="Albums_AlbumNouveau" %>

<%@ Reference Control="AjoutePhoto.ascx" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title>Arch[i]mages</title>
    <link rel="stylesheet" type="text/css" href="../Design/stylesheet.css">
</head>

    <form id="form1" runat="server">
       
            &nbsp;

                    ----

                                    &nbsp;&nbsp;&nbsp;
               ,
                                   
                    Nom du nouvel album

                   

                   

                    <table style="width: 100%">
                        ----

                           ,
                                Nom de l'album:

                    </td>
                                                            ,
                                                            Catégorie:,
                                                   
                        ----

                           ,
                                Description:

                    </td>
                                                            ,
                       
                        ----

                                                            Lien externe:

                    ,
                                                            ,
                       
                   

                   

                                            ----

                                                            Nombre de photos à ajouter:
                                ,
                                                            ,
                       
                   

                   

                    &nbsp;

                   
                   
                    <hr />
                    </td>
            </tr>
        </table>
    </form>

</html>

Fichier AlbumNouveau.aspx.vb :
Partial Class Albums_AlbumNouveau
    Inherits System.Web.UI.Page

    Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
        Dim i As Integer
        If Session.Item("Control") IsNot Nothing Then
            For i = 1 To Session.Item("Control")
                CreateControl("Photo" & i.ToString)
            Next
        Else
            Session.Add("Control", 0)
            Me.lblNbPhotos.Text = "Aucune"
        End If
    End Sub

    Protected Sub btnAjouter_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnAjouter.Click
        Session.Item("Control") += 1
        Me.lblNbPhotos.Text = Session.Item("Control").ToString
        CreateControl("Photo " & Session.Item("Control"))
    End Sub

    Protected Sub CreateControl(ByVal ID As String)
        Dim pnlDetailPhoto As New ASP.AjoutePhoto, lblBr As New Label, lblID As Label
        pnlDetailPhoto.ID = ID
        Me.pnlPhotos.Controls.Add(pnlDetailPhoto)
        AddHandler pnlDetailPhoto.Destroy, AddressOf RetirePhoto

        lblID = pnlDetailPhoto.FindControl("lblID")
        lblID.Text = ID
        lblBr.ID = "Saut" & ID
        lblBr.Text = "
"
        Me.pnlPhotos.Controls.Add(lblBr)
    End Sub

    Protected Sub btnValidate_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnValidate.Click
        'Vérification qu'une photo au moins est ajoutée
        If Session.Item("Control") = 0 Then
            Me.Validator4.Validate()
        End If
    End Sub

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Me.lblNbPhotos.Text = Session.Item("Control").ToString
    End Sub

    Private Sub RetirePhoto(ByVal sender As Object, ByVal e As System.EventArgs)
        Dim pnlDetailPhoto As ASP.AjoutePhoto
        Dim objFileUpload As FileUpload
        pnlDetailPhoto = sender
        MsgBox("Procédure Sub RetirePhoto(" & pnlDetailPhoto.ID.ToString & ")")
        objFileUpload = pnlDetailPhoto.FindControl("objFileUpload")
        If objFileUpload.FileName <> "" Then
            'Demande confirmation
            If MsgBox("Etes-vous sûr de vouloir supprimer cette photo ?", MsgBoxStyle.YesNo, "Avertissement") = MsgBoxResult.Yes Then
                MsgBox("La photo " & pnlDetailPhoto.ID.ToString & " sera supprimée", MsgBoxStyle.OkOnly, "Ok")
            End If
        End If
        Session.Item("Control") -= 1
        MsgBox("Reste " & Session.Item("Control").ToString & " controls")
        objFileUpload.Dispose()

    End Sub

End Class

Fichier AjoutePhoto.ascx :






<%@ Control Language ="VB" AutoEventWireup="false" CodeFile="AjoutePhoto.ascx.vb" Inherits="Albums_AjoutePhoto" ClassName="AjoutePhoto"%>
    ----

                   
           

            ,
                    ,
                    ,
   
    ----

                    Titre:,
   
    ----

                    ,
   
    ----

   

<hr />



Fichier AjoutePhoto.ascx.vb:

Public Class Albums_AjoutePhoto
    Inherits System.Web.UI.UserControl

    Public Event Destroy(ByVal sender As Object, ByVal e As System.EventArgs)

    Protected Sub btnSupprimer_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSupprimer.Click
        RaiseEvent Destroy(Me, New System.EventArgs)
    End Sub
End Class

Ca me rendrait un grand service si vous pouviez jeter un coup d'oeil là-dessus, je tourne en rond depuis une semaine...!

Merci

5 réponses

Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
28
Bonsoir,

MsgBox ??? tu sais qu'il y a des options un peu mieux pour faire du debug ... utilises au moins le trace.write ou alors tu peux regarder ce tutorial http://www.aspfr.com/tutoriaux/DEBUG-ASP-NET-AVEC-VISUAL-STUDIO_384.aspx 

Pour ton problème, il faut absolument rajouter les controles dynamique dans le page_init sinon les events ne seront pas déclenché ... j'ai pas regardé le code mais je pense que c'est pour ca que cela plante ...

<hr />Cyril - MVS - MCP
Messages postés
9
Date d'inscription
lundi 14 juillet 2003
Statut
Membre
Dernière intervention
13 août 2006

Oui oui je te remercie du conseil, évidemment j'ai aussi utilisé les points d'arrêts etc...

Par contre je ne comprends pas bien ta remarque concernant les contrôles dynamiques...? J'ai justement une boucle dans mon Page_Init qui s'en charge:
For i = 1 To Session.Item("Control")
   CreateControl("Photo" & i.ToString)
Next

Ce n'est pas "suffisant" ?

Merci de ton aide... [:p]
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
28
Je viens de rapidement regardé ton code. Il ne faut pas utiliser MsgBox !!! msgbox ouvre une popup en local sur le serveur mais absolument pas sur le client donc une partie de ton code ne fonctionera pas ...

Je ne comprend pas ou tu supprimes ton UserControl, tout ce que tu fais c'est décrementer ta variable session lors du remove ... ce qu'il faudrais c'est mettre un visible=false sur ton contrôle pour qu'il ne soit plus présent ...

Je n'ai pas compris pourquoi tu passes par ca, j'ai l'impression que tu es en train de recréer un repeater ou datalist ... ce serait surement plus simple de les utiliser :-)

<hr />Cyril - MVS - MCP
Messages postés
9
Date d'inscription
lundi 14 juillet 2003
Statut
Membre
Dernière intervention
13 août 2006

Ben en fait ce que je cherche à faire, c'est une interface pour permettre à des utilisateurs d'uploader une série de photos, en vue de créer un album.


Chaque usercontrol rassemblera des infos sur une photo, essentiellement le chemin du fichier à uploader sur le serveur et un nom associé à la photo. En plus donc de ces deux contrôles, un bouton "Supprimer" permettra d'éliminer une seule des n photos que l'utilisateur voudra uploader.


Je ne sais pas si je m'y prends bien: si tu as une autre solution, je suis prenneur aussi! Quoique j'aimerais bien quand même comprendre pourquoi je n'arrive pas à mes fins...


En plus de décrémenter ma variable, je fais aussi un objFileUpload.Dispose(): ce n'est pas bon?
Enfin, comment je pourrais utiliser un Repeater sans connaître le nombre de photos que l'utilisateur voudra uploader, tout en lui permettant à tout moment de supprimer une des photos qu'il voulait enregistrer...?
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
28
objFileUpload.Dispose() a mon avis ca ne sert à rien :s essaye en le mettant à visible=false on en le supprimant de la collection de controls.


pour ce qui est du repeater, dés que j'ai une liste je l'utilise :-) c'est beaucoup plus simple, mais ca devrait aussi fonctionner comme tu fais.

<hr />Cyril - MVS - MCP