IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

[C#] User Control dynamic


Sujet :

ASP.NET

  1. #1
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Points : 233
    Points
    233
    Par défaut [C#] User Control dynamic
    Bonjour.

    J'ai un formulaire qui doit récupérer une liste de messages depuis une base données. Une fois ces messages récupérés, je dois créer (dynamiquement) autant de UserControl qu'il y a de messages. Chaque UserControl possède une boite de texte et un bouton 'SAVE'.

    Lorsque la page se charge, je créer NB UserControl, génère un nouvel ID pou chacun, sauvegarde les IDs dans le ViewState et enfin je les ajoute dans un PlaceHolder. Bon ! Jusqu'ici tout va très bien, les controles s'affichent et avec les bonnes valeurs. Où le problème survient c'est ici :

    Lors d'un PostBack je re-créer chacun des UC dans le PlaceHolder, et ensuite l'événement OnClick du UC est excéuté, mais le PlaceHolder est à présent VIDE ! Pourquoi ???

    Voilà un peu de code du formulaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    private void Page_Load(object sender, System.EventArgs e)
    {
    	// Postback ?
    	if (!IsPostBack)
    	{
    		// Création des boite de messages
    		ArrayList Component_Name = new ArrayList( ColApp.Count );
    		this.m_CommentsList.Controls.Clear();
    		int i = 0;
    		foreach( CMessage p in m_MessageList )
    		{
    			// Créer un UC
    			UCMessage newBox = (PCPComments)this.LoadControl( "WUC/UCMessage.ascx" );
    			newBox.EnableViewState = true;
     
    			// Valeur du message
    			newBox.Message = p;
     
    			// ID de la Boite
    			newBox.ID = "Message_Box_" + (++i);
     
    			// Sauvegarder le nom de ce UC
    			Component_Name.Add( newBox.ClientID );
     
    			// Ajouter ce UC au PlaceHolder
    			m_PlaceHolderMessage.Controls.Add( newBox );
    		}
    		ViewState.Add( "COMPONENT_NAME_COMMENTS", (ArrayList)Component_Name );
    	}
    	else
    	{
    		// Re-créer et réassigner les valeur à l'aide du Viewstate bag
    		ArrayList Component_Name = (ArrayList)ViewState["COMPONENT_NAME_COMMENTS"];
    		if (Component_Name != null && Component_Name.Count > 0)
    		{
    			for (int i = 0; i < Component_Name.Count; ++i)
    			{
    				UCMessage p = (UCMessage)this.LoadControl( "WUC/UCMessage.ascx" );
    				p.EnableViewState = true;
     
    				// Add control to the placeholder
    				m_PlaceHolderMessage.Controls.Add( p );
     
    				// ID du UC
    				p.ID = (string)Component_Name[i];
     
    				// Valeur du message
    				p.Message = m_MessageList[i];
    			}
    		}
    	}
    }

    Dans le WebUser control (rien de palpitant...) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    private void m_Bt_Save_Click(object sender, System.EventArgs e)
    {
        // Mise à jour du message depuis la boite de text
    }
     
    #region Web Form Designer generated code
    override protected void OnInit(EventArgs e)
    {
    	InitializeComponent();
    	base.OnInit(e);
    }
     
    private void InitializeComponent()
    {
    	this.Load += new System.EventHandler(this.Page_Load);
    	this.m_bt_Save.Click += new System.EventHandler( this.m_Bt_Save_Click );
    }
    #endregion

    Un gros merci pour votre aide parce que c'est le délire !

  2. #2
    Inscrit Avatar de bilb0t
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    378
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 378
    Points : 283
    Points
    283
    Par défaut
    T'as essayé de debugger pour voir ce qui se passe ds le else ?

    T'es sur que les object de ton array son sérialisable ?

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    Je pense que le probleme vient de ton click.
    Regarde en debug la valeur de tes sender et eventArgs e .

  4. #4
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Points : 233
    Points
    233
    Par défaut
    Bonjour et merci pour vos réponse.

    Citation Envoyé par bilb0t
    T'as essayé de debugger pour voir ce qui se passe ds le else ?

    T'es sur que les object de ton array son sérialisable ?
    Ce qui est placé dans le viewstate ce sont de des nom de composant, donc des string. Oui c'est sérialisable

    Citation Envoyé par nalaya
    Je pense que le probleme vient de ton click.
    Regarde en debug la valeur de tes sender et eventArgs e .
    Je ne vois pas l'intérêt de vérifier le sender de l'événement Onclick, puisqu'elle s'exécute comme elle se doit, le problème ici c'est que le PlaceHolder soit vide après un postback (click) et même si j'ai recréé les composants dans le Page_Load.

    Merci encore.

  5. #5
    Membre à l'essai
    Inscrit en
    Mai 2004
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    salut

    Vérifie si ton page-Load s'éxécute apres le click.

  6. #6
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Points : 233
    Points
    233
    Par défaut
    Citation Envoyé par justice007
    salut

    Vérifie si ton page-Load s'éxécute apres le click.
    Allo justice007.

    Oui, elle s'exécute.
    En mode !Postback, le stack est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Form:Page_Load --> UC_Paqe_Load.
    En mode PostBack (après le click)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Form:Page_Load --> UC_Page_Load --> UC_ClickEvent
    Merci

  7. #7
    Candidat au Club
    Inscrit en
    Septembre 2004
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Si tu veux que des contrôles dynamiques réapparaissent après un PostBack, tu dois les créer dans le Page_Init()

  8. #8
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Points : 233
    Points
    233
    Par défaut
    Bonjour.

    Merci à tout le monde, mais j'ai enfin trouvé la solution par moi même.
    Le petit truc c'est de créer les composants dans le Page_Load si nous somme pas en mode PostBack. Dans le cas d'un PostBack alors les composants doivent être récréés (même ID très important et dans le même ordre) mais dans la fonction suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    protected override void CreateChildControls()
    ** Mais attention **
    Lorsque nous ne sommes pas dans un PostBack la fonction Page_Load est exécuté avant CreateChildControls tandis que lors d'un PostBack c'est la fonction CreateChildControls qui est exécuté avant le PostBack.

    Bref, tout et cela fonctionne à merveille .

    Il y a de ça quelques jours, j'ai essayé de créer un composant qui devais générer des boutons dynamiques. Ce composant était appliqué sur une WebForm qui elle lui fournissait le nom, propriétés et fonction événementielles des boutons. Tout ceci était stocké dans une collection d'informations sur les boutons. Le seul hic c'est que lors d'un PostBack, il me fallait sauvegarder un pointeur ou la fonction événementiel rataché à chaque boutons. L'idéal aurait été de les sérialiser dans le ViewState Je ne crois pas que ce soit possible mais peut-être que je me trompe ?

    Merci à tous.

  9. #9
    Candidat au Club
    Inscrit en
    Septembre 2004
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Avais-tu essayé de créer les composants dans le Page_Init ? Je le fais sur mes pages et je n'ai aucun problème, à moins que je n'aie pas compris exactement ton problème...

  10. #10
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Points : 233
    Points
    233
    Par défaut
    Citation Envoyé par yanjost
    Avais-tu essayé de créer les composants dans le Page_Init ? Je le fais sur mes pages et je n'ai aucun problème, à moins que je n'aie pas compris exactement ton problème...
    Allo

    De ce que j'ai testé cela ne fonctionnait pas vraiment. "CreateChildControls" est la seul option que j'ai pu trouvé qui fonctionnait à coup sur.

    Je réessayerai une autre fois avec des configurations différentes et un projet différent. Celui-ci est assez immence, complexe et en retard alors je vais me contenter de cela .

    Tu aurais pas solution à mon autre problème ? Conserver des événements dans une collection d'information sur des boutons à générer dynamiquements. La collection est interfacé par "System.Collections.CollectionBase" et elle possède des membres du genre "nom, text, accessible, couleur de texte, couleur de bordures, etc..".
    Le problème est similaire à celui décrit plus tôt cependant le hic c'est que j'ai entendu dire que des événements de boutons doivent toujours être relinker à leur fonction delegate lorsqu'on les recrer dynamiquement. Je suis pas capable de les stocker durant le temps d'un PostBack car on ne peut sérialiser un événement ou son adresse dans la collection et ensuite dans le ViewState....

    Merci yanjost.

  11. #11
    Candidat au Club
    Inscrit en
    Septembre 2004
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Démarre un nouveau topic et on verra si je peux t'aider.
    N'oublie pas le tag [RESOLU] (en bas de la page)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [user control]
    Par Alex35 dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 12/12/2005, 15h09
  2. [C#]liste de choix dans une propriété d'un user control
    Par LeDeveloppeurDotNet dans le forum Windows Forms
    Réponses: 2
    Dernier message: 07/10/2005, 12h41
  3. [C#] User control
    Par Verboz dans le forum ASP.NET
    Réponses: 4
    Dernier message: 27/04/2005, 22h46
  4. [C#] DateTimePicker web user control
    Par titi29 dans le forum ASP.NET
    Réponses: 8
    Dernier message: 29/06/2004, 18h38
  5. [VB.NET] Provoquer le rechargement d'un user control..
    Par didoboy dans le forum ASP.NET
    Réponses: 7
    Dernier message: 30/04/2004, 14h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo