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 :

Pas tout compris à l'utilisation du viewstate


Sujet :

ASP.NET

  1. #21
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    Ben comme j'ai dis dans mon premier message :

    - Je charge la variable ViewState("rq") dans la sub du click du bouton du formaulire, dans le composant du formulaire
    - Je lis la variable ViewState("rq") dans le Init du composant du GridView pour la placer dans le SelectCommand du SQLDataSource du GridView
    - Et donc, ne pas oublier que les deux composants sont ajoutés dynamiquement dans une page qui est toujours la même.


    Ce que je comprends grâce à toute tes explications c'est qu'entre les deux elle doit se perdre ou un truc réinitialise le ViewState. Et vu que je ne maitrise pas du tout cette technique, je sèche total.

  2. #22
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Citation Envoyé par zooffy Voir le message
    - Je lis la variable ViewState("rq") dans le Init du composant du GridView pour la placer dans le SelectCommand du SQLDataSource du GridView
    Sauf que comme je l'ai dit, le viewstate n'est pas disponible dans l'init du composant. Il faut le lire dans le load...

  3. #23
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    Oops, depuis je l'ai déplacé dans le Laod du composant.

  4. #24
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Citation Envoyé par zooffy Voir le message
    Oops, depuis je l'ai déplacé dans le Laod du composant.
    Dans ce cas, je ne vois que 2 raisons.
    1 - Ce n'ai pas le meme viewstate que tu utilise (par exemple la sauvegarde est faite dans Page.Viewstate et la relecture dans gridview.Viewstate)
    2 - Tu as desactivé le viewstate sur le composant ou tu sauvegarde (enableviewstate = false)

  5. #25
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    Alors être bien sûr, j'ai forcé dans la définition de la page et des composants
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <%@ Control Language="VB" AutoEventWireup="false" CodeFile="ListeBiens.ascx.vb" Inherits="Module_Immo_ListeBiens" EnableViewState="true" %>
    Ensuite, le Page.ViewState c'est du ReadOnly, alors je vois pas comment le forcer, surtout que je ne rien de particulier, juste ViewSate("rq").

    Je vois le concept que tu soulève, mais comment faire pour lui dire de mettre et de piocher dans le même viewState ?

  6. #26
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Tous les composants web ont une variable Viewstate avec asp. donc on a vite fait de faire, dans le contexte de la page :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.Viewstate["rq"] = "hello";
    puis pour lire, dans le contexte d'un composant différent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String str = this.Viewstate["rq"] ;
    C'est pas forcement super visible quand on étend des classes. Mais franchement, je ne vois pas comment t'aider davantage sans voir le code...

  7. #27
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    Je vois ce que tu veux dire, mais je n'utilise pas ce genre de chose, du tout.

    Alors je vais metre tout le CodeBehind. Si tu veux le code HTML dis le moi, je le posterais.

    Donc, le composant 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
     
     
    Partial Class Module_Immo_RechercheBien
        Inherits System.Web.UI.UserControl
     
        Protected Overrides Function SaveViewState() As Object
            Return MyBase.SaveViewState()
        End Function
     
        Protected Overrides Sub LoadViewState(ByVal savedState As Object)
            MyBase.LoadViewState(savedState)
        End Sub
     
        Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
            RemplirListePredefinie(ddlTypeBien, "TypeBien")
            RemplirListePredefinie(ddlTypeTransac, "TypeTransac")
     
        End Sub
     
        Protected Sub btnRecherche_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnRecherche.Click
            Dim PrixMini, PrixMaxi, PieceMini, PieceMaxi As Integer
            If txtPrixMini.Text = "" Or Not IsNumeric(txtPrixMini) Then
                PrixMini = 0
            Else
                PrixMini = txtPrixMini.Text
            End If
            If txtPrixMaxi.Text = "" Or Not IsNumeric(txtPrixMaxi) Then
                PrixMaxi = 10000000
            Else
                PrixMaxi = txtPrixMaxi.Text
            End If
            If txtPieceMini.Text = "" Or Not IsNumeric(txtPieceMini) Then
                PieceMini = 0
            Else
                PieceMini = txtPieceMini.Text
            End If
            If txtPieceMaxi.Text = "" Or Not IsNumeric(txtPieceMaxi) Then
                PieceMaxi = 100
            Else
                PieceMaxi = txtPieceMaxi.Text
            End If
            ViewState("rq") = "EXEC dbo.IMMO_SelectionBienRecherche " & ddlTypeBien.SelectedValue & ", " & ddlTypeTransac.SelectedValue & ", " & PrixMini & ", " & PrixMaxi & ", " & PieceMini & ", " & PieceMaxi & ", " & dacVille.IdVille
     
        End Sub
    End Class
    La procédure RemplirListePredefinie va chercher des donnée en BDD et rempli la liste, tout simplement, sans fioriture.

    Maintenant le codeBehind du composant du GridView
    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
     
     
    Partial Class Module_Immo_ListeBiens
        Inherits System.Web.UI.UserControl
     
        Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
     
        End Sub
     
        Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            ChargeGV()
        End Sub
     
        Protected Sub ChargeGV()
            With sdsListeBien
                .SelectCommandType = SqlDataSourceCommandType.Text
                If ViewState("rq") <> "" Then
                    .SelectCommand = Session("rq")
                    Logage(ViewState("rq"))
                Else
                    .SelectCommand = "EXEC dbo.IMMO_SelectionBienDefault"
                End If
            End With
            With gvListeBien
                .AllowPaging = True
                .AllowSorting = False
                .AutoGenerateColumns = False
                .EmptyDataText = "Pas d'annonce disponible pour votre recherche"
                .ShowHeader = False
                .ShowFooter = False
                Dim tpFicheBien As New TemplateField
                With tpFicheBien
                    .ItemTemplate = New gvtplBien()
                End With
                .Columns.Add(tpFicheBien)
                .DataBind()
     
            End With
        End Sub
    End Class
    Y a rien d'autre au niveau des composants.

    Au niveau de la page default.aspx, ça va être plus compliqué parce qu'il y a plein de bout de code qui ne vont pas servir mais je vais tenté de faire une sélection.

    D'abords le code HTML de la page
    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
     
    <%@ Page Language="VB" AutoEventWireup="false" MasterPageFile="~/MasterPage/Default.master" CodeFile="Default.aspx.vb" Inherits="Defaulte" EnableEventValidation="false" Culture="fr-FR" EnableViewState="True" %>
    <asp:Content ID="cHeader" runat="server" ContentPlaceHolderID="cphHeader"></asp:Content>
    <asp:Content ID="cSM" runat="server" ContentPlaceHolderID="cphSM">
        <ajax:ScriptManager ID="smGene" runat="server" EnableScriptGlobalization="true"></ajax:ScriptManager>
        <script type="text/javascript" src="/scripts/global.js"></script>
    	<script type="text/javascript" src="/scripts/Silverlight.js"></script>
        <div id="DivUpdate" class="divProgress">
        Patientez ...
        <asp:Image ID="imgWait2" runat="server" ImageUrl="~/App_Themes/wait.gif" />
        </div>
    </asp:Content>
    <asp:Content ID="cEntete" ContentPlaceHolderID="cphEnTete" Runat="Server"></asp:Content>
    <asp:Content ID="cGauche" ContentPlaceHolderID="cphGauche" Runat="Server"></asp:Content>
    <asp:Content ID="cCentral" ContentPlaceHolderID="cphCentral" Runat="Server"></asp:Content>
    <asp:Content ID="cDroite" ContentPlaceHolderID="cphDroite" Runat="Server"></asp:Content>
    <asp:Content ID="CPied" ContentPlaceHolderID="cphPied" Runat="Server"></asp:Content>
    Bon là, rien de folichon, ça reprends les Content de la MasterPage, tout simplement. En plus, je met le truc qui va bien pour l'Ajax et zou.

    Le codeBehind de cette page :
    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
     
     
    Partial Class Defaulte
        Inherits System.Web.UI.Page
     
        Protected Sub Page_PreInit(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreInit
            ProjetY.PageY.OuvertureSite(Me.Page)
     
        End Sub
     
        Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
            ProjetY.PageY.OuverturePage(Me.Page)
        End Sub
     
        Protected Sub Page_LoadComplete(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.LoadComplete
            ProjetY.Statistique.PreparationStat(Me.Page)
        End Sub
    End Class
    Le Pre Init, on va passer, ça sert juste à vérifier l'existence du site, son état de maintenance (ou pas) et quelques paramettre de sécurité.

    Le loadComplete ne sert qu'à gérer les statistiques par une isertion de donnée dans la base rien de plus.

    Le Init, là c'est le coeur du système. Voici le code de la procédure OuverturePage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Public Shared Sub OuverturePage(ByRef PageduSite As Page)
                'Vérification de l'existence de la page
                If VerifPage(PageduSite) = 0 Then
                    'Renvoi vers module "EnConstruction"
                    ConstruirePage(PageduSite, GetPageId("EnConstruction"))
                Else
                    'Vérification des autorisations et renvoi vers la page de Restriction d'accès.
                    VerifAutorisation(VerifPage(PageduSite), PageduSite)
                    'Construction des modules de la page
                    ConstruirePage(PageduSite, VerifPage(PageduSite))
                End If
            End Sub
    Et là, on va prendre ConstruirePage.
    La procédure VerifAutorisation ne fait que vérifier si tu peux ou pas voir la page en question.
    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
            Public Shared Sub ConstruirePage(ByRef PageduSite As Page, ByVal PageId As Integer)
                Dim strNomTheme As String = GetParamPage("Theme", PageId)
                With PageduSite
                    .Title = GetParamPage("Page_Titre", PageId)
                End With
                Dim dt As DataTable = New DManager("DataDev").RetournerTable("EXEC CORE_PageComposant " & PageId)
                'Récupération du Form de la page
                Dim PageForm As HtmlForm = PageduSite.Controls(0).FindControl("form1")
                If dt.Rows.Count <> 0 Then
                    For Each dr As DataRow In dt.Rows
                        'Chargement des composants dans leur trous respectifs
                        PageForm.FindControl(dr.Item("Compo_Cph")).Controls.Add(PageduSite.ParseControl(ParseCtrl(dr.Item("Compo_Nom"), dr.Item("ComposantId"), dr.Item("Id_Composant"))))
                    Next
                Else
                    PageduSite.Response.Redirect(GetPage("EnConstruction", enTypeRetour.Lien))
                End If
                Dim css As New HtmlLink()
                With css
                    Select Case Current.Request.Browser.Browser.ToString
                        Case "IE"
                            .Href = "~/App_Themes/" & strNomTheme & "/" & strNomTheme & "IE.css"
                        Case "Firefox"
                            .Href = "~/App_Themes/" & strNomTheme & "/" & strNomTheme & "FF.css"
                        Case Else
                            .Href = "~/App_Themes/" & strNomTheme & "/" & strNomTheme & ".css"
                    End Select
                    .Attributes("rel") = "stylesheet"
                    .Attributes("type") = "text/css"
                    .Attributes("media") = "all"
                End With
                PageduSite.Header.Controls.Add(css)
            End Sub
    Alors là, pas mal de chose sur le design, le CSS, le bon fonctionnemnet des composants.
    Ce qui va t'interresser se trouve dans la procédure ParseCtrl qui permet le "'Chargement des composants dans leur trous respectifs", la ligne de commentaire que j'ai mis en rouge pour que tu repère.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Public Shared Function ParseCtrl(ByVal Nom_Compo As String, ByVal ComposantId As Guid, ByVal Id_Composant As Integer) As String
                Dim compo As String = ""
                Dim dto As DataTable = New DManager("Datadev").RetournerTable("EXEC CORE_ComposantOption '" & ComposantId.ToString & "'")
     
                compo &= "<CompoSite:" & Nom_Compo & " ID='" & Nom_Compo & Id_Composant & "' "
                For Each ro As DataRow In dto.Rows
                    compo &= ro.Item("Option_Nom") & "='" & ro.Item("Option_Valeur") & "' "
                Next
                compo &= "runat='server' />"
                ParseCtrl = compo
            End Function
    Et donc, là, ça prend les paramettres envoyés par l'appel de la procédure, elle même nourir d'un montée de donnée de la BDD et ça fabrique une String injectée directement la page (dans les ContentPalceHolder, les fameux "trous").

    Voilà, avec tout ça tu as la totalité du processus et même si tu récupère le tout, tu as la base de mon système "génial" pour fabriquer des sites en une heure chrono. Bon, d'accord, il reste 10 000 lignes de code pour tous les détails qui vont autour, amis en gros, là y a tout ce qu'il faut.
    ça sera bientôt dans mon blog.

    Si tu veux voir autre chose, n'hésites pas, tu me dit et je poste.

    Maintenant, j'espère que autant de code ne vas pas noyer le truc....

    Mais un grand merci pour ta patience.

  8. #28
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    C'est bien, on avance. On est exactement dans le cas que j'ai dit au dessus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Class Module_Immo_RechercheBien
    ...
    ViewState("rq") = "EXEC dbo.IMMO_SelectionBienRecherche " & ddlTypeBien.SelectedValue & ", " & ddlTypeTransac.SelectedValue & ", " & PrixMini & ", " & PrixMaxi & ", " & PieceMini & ", " & PieceMaxi & ", " & dacVille.IdVille
    Tu utilises donc le viewstate d'un objet de type "Module_Immo_RechercheBien"

    et :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Class Module_Immo_ListeBiens
    ...
    If ViewState("rq") <> "" Then
                    .SelectCommand = Session("rq")
                    Logage(ViewState("rq"))
                Else
                    .SelectCommand = "EXEC dbo.IMMO_SelectionBienDefault"
                End If
    qui est de type "Module_Immo_ListeBiens"


    J'en deduis que tu n'as pas compris que le Viewstate est différent pour chaque composant. Il est différent par classe mais aussi par instance !! Le viewstate d'un bouton n'est pas le meme que celui du bouton d'a coté

    Pour resoudre ton probleme, il faut utiliser un composant qui a acces aux 2 qui sont sensés l'utiliser...

  9. #29
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    Non, effectivment, je n'avais pas compris ça du tout.
    Je croyais que le ViewsState, y en avais qu'un par page !!

    Ok, donc déjà, j'ai appris un truc aujourd'hui, c'est une bonne chose.

    Mais comment je fais pour mettre ça dans le même ViewState ?

    Ou alors tu me dis de mettre le Formulaire ET le GridView dans le même composant ?

    Y a pas un moyen pour envoyer la String dans le ViewState de la Page ?
    Comme ça, ça serait accessible par les deux composants.

Discussions similaires

  1. [AJAX] Transmission de variable, j'ai pas tout compris
    Par msg_dracula dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 23/07/2007, 00h15
  2. Réponses: 1
    Dernier message: 28/03/2007, 19h13
  3. je n ai pas tout compris dans le script
    Par letigre dans le forum Langage
    Réponses: 2
    Dernier message: 19/08/2006, 10h44
  4. bouton et bitmap - a pas tout compris
    Par mat_monroe dans le forum MFC
    Réponses: 7
    Dernier message: 20/06/2006, 15h25

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