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 :

[VB.NET] Pb sur la g�n�ration de control dynamique.


Sujet :

ASP.NET

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    46
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 46
    Par d�faut [VB.NET] Pb sur la g�n�ration de control dynamique.
    Bonjour,
    J'ai un nouveau probl�me qui n'existait pas avant. Je ne sais pas pourquoi il est apparu...
    Voici la b�te :
    Failed to load viewstate. The control tree into which viewstate is being loaded must match the control tree that was used to save viewstate during the previous request. For example, when adding controls dynamically, the controls added during a post-back must match the type and position of the controls added during the initial request.
    Si quelqu'un a une id�e (voir plusieurs...)
    Merci d'avance. Si vous avez besoin du code, faite moi signe.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    46
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 46
    Par d�faut
    C'est une erreur assez bizarre, je viens de mettre un try catch... Une fois l'exeption lev�e, la page se charge bien, sans probl�me apparent.
    Voici mon code, il est assez dense, mais ne vous inqui�tez pas l'algo est assez simple, et j'ai comment� :
    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
      Dim row As DataRowView
            Dim numrow As Integer
            Dim numcell As Integer = 0
     
            'Boucle permettant de remplir les "rows" (ligne) d'un tableau avec les informations contenues dans le dataview.
            TableDescriptif.Controls.Clear()
            For numrow = 0 To MonDataView.Count - 1
                Dim r As New TableRow()
                Dim r1 As New TableRow()
                Dim j As Integer
     
                row = MonDataView.Item(numrow)
     
                ' Boucle permettant de créer les "cell" (cellule) d'une ligne.
                For j = 0 To numcell
                    Dim c As New TableCell()
                    Dim c1 As New TableCell()
                    Dim c2 As New TableCell
                    Dim lblnom As New Label
     
                    lblnom.Text = row.Item(0).ToString & " :"
                    c.Controls.Add(lblnom)
                    r.Cells.Add(c)
                    Select Case row.Item(4).ToString
                        Case "TextBox" 'L'erreur se crée dans ce case.... et uniquement dans celui-ci (pour l'instant)
                            Dim TxtBox As New TextBox
                            TxtBox.ID = "DyTxtBox" & numrow.ToString
                            TxtBox.Width = New WebControls.Unit(1200)
     
                            If Not IsDBNull(row.Item(2)) Then
     
                                TxtBox.Text = row.Item(2).ToString
     
                                If Not IsDBNull(row.Item(5)) Then
                                    TxtBox.MaxLength = CType(row.Item(5), Integer)
                                End If
     
                            End If
     
                            c1.Controls.Add(TxtBox)
                            r1.Cells.Add(c1)
     
                        Case "TextBoxNum"
                            Dim TxtBoxNum As New TextBox
                            Dim ValidExpression As New WebControls.RegularExpressionValidator()
     
                            TxtBoxNum.Width = New WebControls.Unit(1200)
                            TxtBoxNum.ID = "DyTxtBoxNum" & numrow.ToString
     
                            ValidExpression.ValidationExpression = "\d{5}"
                            ValidExpression.ID = "Valid" & numrow.ToString
                            ValidExpression.ControlToValidate = "DyTxtBoxNum" & numrow.ToString
                            ValidExpression.Text = "*"
                            '  ValidExpression.ErrorMessage = "Utiliser des chiffres pour ce champs."
     
                            If Not IsDBNull(row.Item(2)) Then
                                TxtBoxNum.Text = row.Item(2).ToString
     
                                If Not IsDBNull(row.Item(5)) Then
                                    TxtBoxNum.MaxLength = CType(row.Item(5), Integer)
                                Else : TxtBoxNum.MaxLength = Integer.MaxValue
                                End If
                            Else : TxtBoxNum.Text = ""
     
                            End If
     
                            c1.Controls.Add(TxtBoxNum)
                            c1.Controls.Add(ValidExpression)
                            r1.Cells.Add(c1)
     
                        Case "DateTime"
     
                            Dim Cal As New Calendar
                            Dim Hid As New TextBox
                            Cal.SelectedDate = Date.Today
                            Cal.ID = "DyCal" & numrow.ToString
                            Hid.ID = "DyHidCal" & numrow.ToString
     
                            c2.Controls.Add(Hid)
                            c1.Controls.Add(Cal)
                            r1.Cells.Add(c1)
                            r1.Cells.Add(c2)
     
                    End Select
     
                Next
     
                TableDescriptif.Rows.Add(r)
                Try
                    TableDescriptif.Rows.Add(r1) 'L'erreur se produit que dans un context particulier, elle se produit au bout de plusieurs itérations du Load...
                Catch ex As HttpException
                    MsgBox(ex.Message, MsgBoxStyle.Critical, ex.Source) 'Vois message ci-dessus
                End Try
                'La fenêtre s'affiche quand normalement...
     
     
            Next
    Pr�cision sur l'erreur.
    1. La page "page1" se charge une 1�re fois - OK
    2. Je me sers d'un DropDownList pours�lectionner la page "page2" avec ses controls - OK
    3- Je me sers de nouveau de la DropDownList pour selectionner la page "page1" avec ses controls - ERREUR
    4- L'exception est lev�e, la fen�tre s'affiche, la page "page1" se charge avec tous les controls..
    Je ne comprends pas.
    Merci pour vos post. J'en ai vraiment besoin.

  3. #3
    Membre �m�rite
    Profil pro
    Inscrit en
    Ao�t 2003
    Messages
    835
    D�tails du profil
    Informations personnelles :
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 835
    Par d�faut
    Hello,

    Encore un probleme de controle charg�s dynamiquement qui ne sont pas cr�es qd il le faut. C'est souvent li� � un manque de compr�hension du fonctionnement d'asp.net et je t'avoue que je n'ai pas envie de me relancer dans ce genre d'explication, en g�n�ral c'est long . Par contre je peux te rediriger vers un autre sujet du m�me genre ou il me semble que l'on avait a peu pr�s expliquer tout ce qui se passe : http://www.developpez.net/forums/vie...er=asc&start=0
    J'espere que �a peut t'aider.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    46
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 46
    Par d�faut
    Merci beaucoup, �a doit �tre ce genre de probl�me, je vais m'y pencher ce matin. Franchement merci, je n'arrivais pas � trouver des explications. D'ailleurs si des tutos existent sur le cycle de vie d'une page asp.net, vous pouvez envoyer quelques liens, �a serait bien sympa.
    Merci � toi Sphax.

  5. #5
    Membre �m�rite
    Profil pro
    Inscrit en
    Ao�t 2003
    Messages
    835
    D�tails du profil
    Informations personnelles :
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 835
    Par d�faut
    J'ai deux liens sur le cycle de vie d'une page qui m'ont bien aid� lorsque j'ai eu moi m�me � comprendre ce qui se passait :

    http://www.15seconds.com/issue/020102.htm
    http://www.c-sharpcorner.com/Code/20...TLifeCycle.asp

    Avec �a + le liens vers l'autre sujet du m�me genre donn� plus haut �a te fait de la lecture, mais tu devrais trouver ton bonheur

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    46
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 46
    Par d�faut
    Effectivement, je viens juste de finir de lire la topics et le 15seconds. C'est pas forcement �vident ... Mais bon dans tous les cas il faut que j'y arrive, j'ai pas trop le choix. J'ai essayer de mettre le chargement de mes controls dans le Init avec pour le changement dynamique au lieu d'une variable de session, un Request. J'ai toujours la m�me erreur. J'ai pas bien compris le ViewState. Je crois que �a sert � sauvegarder les donn�es ant�rieur au chargement non ? Car l'erreur a l'air de provenir de l�...

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    46
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 46
    Par d�faut
    C'est sur le LoadViewState que l'erreur se produit. Je ne comprends pas...
    1- L'�v�nement Init est effectu�
    2- Si PostBack, la fonction LoadViewState est effectu�e
    3- L'�v�nement OnLoad est effectu�.

    Mon �tonnement r�side dans le fait que cette erreur ne produit pas la 1�re fois, ni la deuxi�me...Exemple :
    J'ai une page qui contient une DropDownList avec deux items (Authentification et Pages)
    1- La page se charge avec les controls associ�s � "Authentification"
    2- Je selectionne dans la DDL "Pages, les controls associ�s s'affiche
    3- Je selectionne de nouveau "Authentification" et l� j'ai une erreur.
    Failed to load viewstate. The control tree into which viewstate is being loaded must match the control tree that was used to save viewstate during the previous request. For example, when adding controls dynamically, the controls added during a post-back must match the type and position of the controls added during the initial request.
    Stack Trace:
    [HttpException (0x80004005): Failed to load viewstate. The control tree into which viewstate is being loaded must match the control tree that was used to save viewstate during the previous request. For example, when adding controls dynamically, the controls added during a post-back must match the type and position of the controls added during the initial request.]
    System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +483
    System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) +195
    System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +424
    System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) +195
    System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +424
    System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) +195
    System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +424
    System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) +195
    System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +424
    System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) +195
    System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +424
    System.Web.UI.Page.LoadAllState() +559
    System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +2237
    Bref, c'est pas clair. Mais en tout cas, c'est sur que c'est un probl�me entre les diff�rents �v�nements de chargement (Init, LoadViewState, Load....). Je ne dois pas faire les bon trucs au bon moment. Si quelqu'un � une id�e. Mon cas est moins compliqu� que lucie.houel car je ne g�n�re pas de control dans des control dynamique. Je me contente de g�n�rer des controls dans un control static...

    Rappel :http://www.developpez.net/forums/vie...er=asc&start=0

  8. #8
    Membre �m�rite
    Profil pro
    Inscrit en
    Ao�t 2003
    Messages
    835
    D�tails du profil
    Informations personnelles :
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 835
    Par d�faut
    J'ai pas regard� ton code en d�tail, mais voil� qques explications sur tout �a.

    Le ViewState sert a sauvegarder l'etat de tes controles d'un postBack � l'autre automatiquement. C'est en gros simplement une collection cl�e-valeur , chaque cl�e �tant l'identifiant d'un controle, et les valeurs le contenu du controle en question.

    Apr�s l'init de ta page, l'evenement LoadViewState � lieu, il rempli cette collection, dont la structure est �tabli par l'arborescence des controles de ta page, avec les infos provenant de la page Web. Il faut donc que le ViewState revenant depuis le client corresponde � ton arborescence de controle actuelle ! C'est l'erreur que tu as : Au moment du LoadViewState asp.net s'aper�oit que ton arbo de controles ne correspond pas � celle sauvegard�e precedemment. C'est pour �a qu'il faut toujours recr�er tes controles dynamiques AVANT le loadViewstate (et en plus sans �a tu perdrais syst�matiquement la valeur contenu dans ton controle dynamique).

    J'espere que c'est a peu pres clair.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    46
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 46
    Par d�faut
    Ok, le LoadViewState contient une collection de mes controls pr�cedent le PostBack. Donc quand asp.net v�rifie l'arborescence, par le LoadViewState, il s'aper�oit que ma collection d'objet a chang�.
    Or si l'on suit ce raisonnement :
    Lorsqu'on charge les controls dans le Init, le LoadView devrait soulever l'erreur, puisque les controls sont diff�rents entre les controls actuels et les anciens m�roris�s par le LoadView. De plus, si on les charges dans le Load, alors par rapport au ancien control le LoadView ne souleverait pas l'exception car la comparaison s'effectuerai avant......
    Bref, asp.net est la gestion dynamique des controls....toute une histoire.
    Pour moi, dans les deux cas �a plante. Lorsque je mets l'algo ci-dessus dans le Init ou dans le Load...La m�me erreur est soulev�e.
    Doit-on Overrider la fonction LoadViewState ?
    Arfffffffff �a ma soule
    Merci vraiment de votre aide car vu le nombre de tutos la dessus je ne m'en sortirais pas .....

  10. #10
    Membre �m�rite
    Profil pro
    Inscrit en
    Ao�t 2003
    Messages
    835
    D�tails du profil
    Informations personnelles :
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 835
    Par d�faut
    Eu... A mon avis ton esprit est en train de s'embrouiller, n'oublie pas que si le LoadViewState a lieu apr�s le init, le SaveViewState a aussi lieu mais vers la fin de vie de la page, et il sauvegarde l'etat de tes controles, tous, y compris ceux charg�s dynamiquement, donc le coup d'apr�s, avant le LoadViewState il faut avoir reconstruit les memes controles, etc...
    Effectivement g�rer les controles dynamiques en asp.net implique d'assez bien maitriser le cycle de vie d'une page et de savoir ce qui se passe dans notre dos, mais une fois �a compris (et aussi le m�canisme du postBack , avec le viewstate qui repr�sente l'etat de la page le coup d'avant) l'ensemble est plutot coh�rent. Pas simple mais coh�rent.

  11. #11
    Membre �clair�
    Inscrit en
    Janvier 2006
    Messages
    79
    D�tails du profil
    Informations personnelles :
    �ge : 43

    Informations forums :
    Inscription : Janvier 2006
    Messages : 79
    Par d�faut
    Voici un autre article bisounux...

    http://aspnet.4guysfromrolla.com/articles/092904-1.aspx

    Conclusion
    In this article we saw how to work with dynamic controls so that their values and view state can be correctly persisted across postbacks. Dynamic controls, as evidenced in this articles and others on 4Guys, offer a great deal of capability, but using dynamic controls can be frustrating due to lost controls or view state if the controls are not added to the hierarchy appropriately. As we saw in this article, the general pattern to follow is:

    1. Add the dynamic controls on each page visit in the page's Initialization stage,
    2. Read/write the dynamic controls' properties and methods in the Page_Load event handler.


    That's really all there is to it! Just make sure you follow this pattern, and dynamic controls become as easy to use as the static controls added in the page's HTML portion.
    La partie en gras m'a vraiment aid� � comprendre la proc�dure � suivre pour faire des controles dynamiques!!

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    46
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 46
    Par d�faut
    Tout d'abord merci pour votre aide, elle m'est fort utile pour mon travail Faut-il recr�er exactement les m�me colonnes ? Car � chaque actualisation, les colonnes de mon objet "Table" change sans cesse.... Merci crimson, je vais regarder �a tout de suite.

  13. #13
    Membre �m�rite
    Profil pro
    Inscrit en
    Ao�t 2003
    Messages
    835
    D�tails du profil
    Informations personnelles :
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 835
    Par d�faut
    Oui il faut recr�er les m�mes controles ! Quitte � les retirer apres le LoadViewState pour en creer de nouveaux ensuite. C'est la le�on que j'ai apprise avec le sujet de lucie.houel .

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    46
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 46
    Par d�faut
    Ah mieux.... Je vais essayer �a apr�s la lecture du bon tuto de crimson... Donc, si je comprend bien, il faut que je recr�e les controls pr�c�dent dans mon init, puis j'en cr�e d'autre dans mon load.....Et �a ad vitam eternam...En fait, il s'agit de leurer le ViewState....
    �a doit pas �tre �a mais �a fait du bien de parler....
    Tr�ve de plaisanteries, c'est � peut pr�s �a ou pas ?

  15. #15
    Membre �m�rite
    Profil pro
    Inscrit en
    Ao�t 2003
    Messages
    835
    D�tails du profil
    Informations personnelles :
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 835
    Par d�faut
    C'est �a . Leurer le ViewState c'est une fa�on de voir, il est qd m�me bien pratique ce ViewState, et puis tu peux toujours le d�sactiver et g�rer la persistance de tes controles manuellement .

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    46
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 46
    Par d�faut
    Merci pour ton lien crimson, c'est un bon site...Sinon un autre sur les cycles de vies et les ViewState....http://msdn.microsoft.com/library/de.../viewstate.asp
    Je vais potacer ce soir...Je vous tient au courant demain en esp�rant �tre un expert dans cette mati�re (je ne me fais pas trop d'illusion ).

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    46
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 46
    Par d�faut
    Je ne sais pas trop pourquoi mais �a marche.....Au d�but en d�sespoir de cause j'ai desactiv� le EnableViewState, puis je l'ai remis et �a marche. De plus, (autrement plus signifiant), je me suis d�brouill� � garder le m�me nombre de colonnes... Ainsi, mon ViewState ne vois que du feu....
    Arf, c'est quand m�me bien interessant tout ce que j'ai appris sur les cycles de vies. Cela reste tout de m�me assez �sot�rique pour moi !

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. [VB.NET]�v�nement sur un controle dynamique
    Par Tunisiano87 dans le forum ASP.NET
    R�ponses: 3
    Dernier message: 11/11/2010, 03h29
  2. [VB.NET] Contrôle dynamique et évènements
    Par johann.C dans le forum ASP.NET
    R�ponses: 4
    Dernier message: 30/11/2009, 10h45
  3. R�ponses: 3
    Dernier message: 11/07/2006, 13h43
  4. [VB.NET]evenement sur un controle ajout� par code
    Par Golzinne dans le forum Windows Forms
    R�ponses: 14
    Dernier message: 01/03/2006, 22h37

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