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

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 46
    Points : 24
    Points
    24
    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 à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 46
    Points : 24
    Points
    24
    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 éprouvé
    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
    Points : 1 046
    Points
    1 046
    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 à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 46
    Points : 24
    Points
    24
    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 éprouvé
    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
    Points : 1 046
    Points
    1 046
    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 à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 46
    Points : 24
    Points
    24
    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 à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 46
    Points : 24
    Points
    24
    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 éprouvé
    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
    Points : 1 046
    Points
    1 046
    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 à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 46
    Points : 24
    Points
    24
    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 éprouvé
    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
    Points : 1 046
    Points
    1 046
    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 régulier
    Inscrit en
    Janvier 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Janvier 2006
    Messages : 79
    Points : 92
    Points
    92
    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!!
    Hana no iro wa
    Utsuri ni keri na

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 46
    Points : 24
    Points
    24
    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 éprouvé
    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
    Points : 1 046
    Points
    1 046
    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 à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 46
    Points : 24
    Points
    24
    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 éprouvé
    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
    Points : 1 046
    Points
    1 046
    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 à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 46
    Points : 24
    Points
    24
    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 à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 46
    Points : 24
    Points
    24
    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