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 :

[ASP.Net 2.0] PostBack, ViewState, et contrôle dynamiques


Sujet :

ASP.NET

  1. #1
    Membre éclairé
    Avatar de strat0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2003
    Messages : 288
    Par défaut [ASP.Net 2.0] PostBack, ViewState, et contrôle dynamiques
    Salut à tous,

    Une fois de plus je me retrouve empêtré dans des problèmes de PostBack/ViewState/Contrôles qui disparaissent alors qu'ils ne devraient pas et contrôles qui restent alors qu'ils devraient disparaître.

    Voilà à quoi ressemble ma page Aspx.

    Elle est divisée en deux dans la largeur. De chaque côté on a une textbox et un bouton. Ceux-ci vont permettre d'effectuer des recherches sur deux tables différentes d'une base de données. Mais attention : je ne fais pas de SQL, la BDD est interfacée avec des classes propriétaires; je balance un string de recherche et ça me renvoie du XML.

    le résultat des recherches s'affichent sous mes textbox dans des tableaux créés dynamiquement (bah oui... impossible de savoir à l'avance combien de résultats ça va me retourner). Je parse moi-même le XML résultat pour afficher juste les infos qui m'intéressent.

    Ensuite (c'est pour ça que cette interface est conçue) l'utilisateur devra cocher des CheckBox dans les tableaux de chaque côté pour "lier" les résultats qui sont identiques.

    Dans l'état actuel des choses, mon problème est le suivant : la recherche fonctionne bien, la création des tableaux dynamiques aussi, mais... lorsque par exemple j'effectue une recherche du côté droit après avoir obtenu un résultat du côté gauche, le tableau des résultats côté droit apparaît bien mais entretemps le tableau des résultats côté gauche a... disparu corps et biens.

    En fait je pense que c'est au niveau de la création des contrôles dynamiques (TableRows, TableCells, CehckBox). Comment préciser que je souhaite que ceux-ci restent affichés lors du prochain PostBack, et inversement (pour ne pas que la prochaine recherche viennent s'ajouter à la précédente dans le tableau) comment vider (réinitialiser?) le tableau au début de la recherche suivante?

    Merci énormément pour vos conseils car je me rends bien compte que tout cela n'est pas très évident.

    Ceci fois-ci je pense que je n'échapperai pas à une bonne capture d'écran (qui vaut mieux qu'un long discours comme chacun sait).
    Images attachées Images attachées  

  2. #2
    Membre Expert Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Par défaut
    Pour créé tu des tableaux dynamiques, tu pourrais très bien utiliser des GrdiView déclarés dans le ASPX, et là ton PB de viewstate serait réglé.

  3. #3
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Par défaut
    Citation Envoyé par guitoux1
    Pour créé tu des tableaux dynamiques, tu pourrais très bien utiliser des GrdiView déclarés dans le ASPX, et là ton PB de viewstate serait réglé.
    +1

  4. #4
    Membre éclairé
    Avatar de strat0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2003
    Messages : 288
    Par défaut
    Citation Envoyé par guitoux1
    Pour créé tu des tableaux dynamiques, tu pourrais très bien utiliser des GrdiView déclarés dans le ASPX, et là ton PB de viewstate serait réglé.
    OK je suis reparti sur ce que vous m'avez dit mais... je sèche vite.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    protected void ListeNoticesAutorite(string RawXml, int i)
        {
            XmlDataSourceGauche.Data = RawXml;
            GridViewResultatGauche.DataSourceID = XmlDataSourceGauche.ID;
    Comment je lui dis "Vas-y rajoute une Row à la GridView et colles-y les infos venant de tel ou tel noeud de ma XmlDataSource" ?

    Sachant qu'il y aura une nouvelle Row à chaque fois que cette fonction void sera appellée (ce nombre dépendant du nombre de résultats à afficher).

  5. #5
    Membre Expert Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Par défaut
    Quand appels-tu ta méthode ListeNoticesAutorite() et que sont les paramètres en entrée ?

    Pour il te faut faire (pour chacune de tes 2 colonnes) :

    1) Une textbox de recherche
    2) Un bouton
    3) un GridView
    4) un SqlDataSource

    La dataSource du GridView est le SqlDataSource
    Quand tu clique sur le bouton, tu alimente ton XmlDataSource avec tes données.

    Et c'est tout, le reste est géré automatiquement pas ces différents controles.
    Après, il y a peut-être des subtilités liées à ta source de données XML. Tu possède un fichier Xml avec toutes les réponse et la textbox sert de filtre sur ce fichier ? ou alors le xml est généré à la volée en fonction de la recherche effectuée, les données dans le xml provenant d'ailleur (BDD) ?

  6. #6
    Membre éclairé
    Avatar de strat0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2003
    Messages : 288
    Par défaut
    Citation Envoyé par guitoux1
    Quand appels-tu ta méthode ListeNoticesAutorite() et que sont les paramètres en entrée ?

    Pour il te faut faire (pour chacune de tes 2 colonnes) :

    1) Une textbox de recherche
    2) Un bouton
    3) un GridView
    4) un SqlDataSource

    La dataSource du GridView est le SqlDataSource
    Quand tu clique sur le bouton, tu alimente ton XmlDataSource avec tes données.

    Et c'est tout, le reste est géré automatiquement pas ces différents controles.
    Après, il y a peut-être des subtilités liées à ta source de données XML. Tu possède un fichier Xml avec toutes les réponse et la textbox sert de filtre sur ce fichier ? ou alors le xml est généré à la volée en fonction de la recherche effectuée, les données dans le xml provenant d'ailleur (BDD) ?
    Partout où tu as écrit SqlDataSource j'imagine que tu voulais dire XmlDataSource.

    Donc côté fichier aspx j'ai effectivement créé mes asp:TextBox, Button, XmlDataSource, et GridView (qui à ce stade n'est pas liée au XmlDataSource car celui-ci est vide).

    Côté aspx.cs, en retour de ma recherche j'obtiens un array contenant des fichiers XML. Donc pour chaque XmlDocument in Array, j'appelle la méthode ListeNoticesAutorite() (qui devra ajouter une Row à la GridView).

    Je connais la structure des fichiers XML renvoyés, mais ce n'est pas la même pour la colonne de gauche et la colonne de droite (je parle de mon interface là).

  7. #7
    Membre Expert Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Par défaut
    Partout où tu as écrit SqlDataSource j'imagine que tu voulais dire XmlDataSource.
    Oui pardons, c'est l'habitude

    Chaque XmlDocument est une ligne de ta gridView, c'est bien ça ?
    Pourquoi dans ce cas ne pas fusionner les différents XmlDocument en un seul avant de lier ce XmlDocument nouvellement créé à ton XmlDataSource ?

  8. #8
    Membre éclairé
    Avatar de strat0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2003
    Messages : 288
    Par défaut
    Citation Envoyé par guitoux1
    Chaque XmlDocument est une ligne de ta gridView, c'est bien ça ?
    Pourquoi dans ce cas ne pas fusionner les différents XmlDocument en un seul avant de lier ce XmlDocument nouvellement créé à ton XmlDataSource ?
    Pourquoi fusionnerais-je tous les XmlDocument en un seul? Ça m'avancerait à quoi?

    Non là ce que j'ai besoin c'est de faire un "Eval" ou "Bind" comme je le ferais côté aspx mais... côté code behind. Je créé un TemplateField dynamiquement? J'y ajoute un ItemTemplate? Et après?

  9. #9
    Membre Expert Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Par défaut
    Pourquoi fusionnerais-je tous les XmlDocument en un seul? Ça m'avancerait à quoi?
    Pour ne pas avoir à traiter chaque ligne de ton GridView séparement. Le but étant de reproduire un comportement classique, c'est-à-dire associer ton gridView à un XmlDataSource qui lui à comme source un fichier XML.

    Non là ce que j'ai besoin c'est de faire un "Eval" ou "Bind" comme je le ferais côté aspx mais... côté code behind
    Tu peux très bien le faire côté ASPX. Vu que tu connais la structure finale de ton XML. Au moment de la liaison entre le XML et le GridView, les données s'afficheront normalement.

  10. #10
    Membre éclairé
    Avatar de strat0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2003
    Messages : 288
    Par défaut
    Je veux bien, ça paraît effectivement tentant comme méthode, mais comme au départ ma XmlDataSource est vide, si je la lies à la GridView côté aspx, j'ai droit à une belle erreur "La référence d'objet n'est pas définie à une instance d'un objet".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <asp:XmlDataSource ID="XmlDataSourceDroite" runat="server" />
                <asp:GridView ID="GridViewResultatDroite" runat="server" DataSourceID="XmlDataSourceDroite">
                </asp:GridView>
    Comment puis-je contourner ça?

    Et donc si je te suis bien, ensuite je fais comme d'habitude : je créé des TemplateField contenant des ItemTemplate côté aspx, et lors du PostBack quand les XmlDataSource seront plein, les données s'afficheront d'elles-mêmes?

  11. #11
    Membre Expert Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Par défaut
    Sinon tu n'est pas obligé de passer par un XmlDataSource. Tu peux directement lier le Xml au GridView (enfin je crois) en passant par sa propriété DataSource (et pas DataSourceID).

  12. #12
    Membre éclairé
    Avatar de strat0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2003
    Messages : 288
    Par défaut
    Bon j'ai essayé ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <asp:GridView ID="GridViewResultatDroite" runat="server">
                    <Columns>
                        <asp:TemplateField>
                            <ItemTemplate>
                                <%# Eval("INTERPRETATION_OEUVRE/DESCRIPTION/OEUVRE_LIBRE/AUTEUR")%>
                            </ItemTemplate>
                        </asp:TemplateField>
                    </Columns>
                </asp:GridView>
    Et :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    GridViewResultatDroite.DataSource = "<INTERPRETATION_OEUVRE><DESCRIPTION><OEUVRE_LIBRE><AUTEUR>Jean-Jacques Pouet</AUTEUR></OEUVRE_LIBRE></DESCRIPTION></INTERPRETATION_OEUVRE>";
                    GridViewResultatDroite.DataBind();
    ...au moment où on exécute la recherche.

    Le résultat c'est que ça ne plante pas, mais ce n'est pas non plus ce que j'espérai... Il y a juste une celllule un peu tarabiscotée qui apparaît avec juste écrit "item" dedans.

  13. #13
    Membre Expert Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Par défaut
    Bon j'ai regarder un peu ton truc.
    Je vois pas pourquoi tu ne peux pas mettre un XmlDataSource vide et le lier à ton DataGrid. Chez ça fonctionne très bien ça.

    Par contre, là où ca coince, c'est le format de ton Xml. En effet, tu ne va pas pouvoir binder à ton DataGrid des données issues de différents niveaux dans l'arborescence du Xml. Ca doit être dans ce format :

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <Parent>
       <Colonne1>valeur</colonne1>
       <Colonne2>valeur</colonne2>
       ...
    </Parent>
    Je penses que tu vas devoir passer par une phase de transformation de ton XML avant de pouvoir le Binder correctement à ton GridView

Discussions similaires

  1. Réponses: 1
    Dernier message: 08/01/2010, 17h28
  2. [ASP.NET][C#] Invalid postback or callback argument.
    Par dinbougre dans le forum ASP.NET
    Réponses: 1
    Dernier message: 02/05/2008, 10h52
  3. [ASP.NET C# 3.5] Linkbuttons dans contrôle perso
    Par chrix dans le forum ASP.NET
    Réponses: 1
    Dernier message: 23/02/2008, 19h10
  4. Réponses: 0
    Dernier message: 23/02/2008, 13h49
  5. Réponses: 7
    Dernier message: 26/02/2007, 12h07

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