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#] Pb avec une DataGrid remplie dynamiquement


Sujet :

ASP.NET

  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 75
    Par défaut [C#] Pb avec une DataGrid remplie dynamiquement
    Bonjour,

    j'ai un gros problème avec une DataGrid : au départ elle ne contient qu'une colonne de bouton, mais dans le code, je lui ajoute dynamiquement des colonnes. Jusque là pas de problème, ça s'affiche bien à l'écran.

    Mais quand je clique sur le bouton (évènement ItemCommand) et que je veux récuperer le contenu de mes colonnes créées dynamiquement (par string sCode = e.Item.Cells[2].Text; il me met l'erreur "Specified argument was out of the range of valid values. Parameter name: index".

    Comment faire ? :o :o :o

  2. #2
    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
    Salut,

    Il faut recréer tes colonnes dynamiques à chaque postBack, de préférence dans le PageInit de ta page (avant le LoadViewState) pour que ça fonctionne.

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 75
    Par défaut
    Peux-tu m'en dire plus sur la méthode LoadViewState stp ? A quoi elle sert ?

  4. #4
    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
    Une petite recherche sur LoadViewState / SaveViewState et le tour est joué .

    Bon, en faisant vite, cette méthode est appelée avant le page_load je crois et se charge de remettre les valeurs de tes contrôles qui sont stockées dans le ViewState dans les controles justement. Ensuite vers la fin de vie de ta page (je sais plus trop qd exactement, surement avant le preRender) la méthode SaveViewState est appelée et fait l'inverse : elle sauve les valeurs de tes contrôles dans le viewState.

    Pour retrouver tte tes valeurs dans tes colonnes de DataGrid , il faut recréer ces colonnes à chaque post back (puisqu'elle sont dynamiques, asp.net ne s'en rappelle pas d'un postback a l'autre) AVANT le loadViewState pour que cette méthode puisse remettre les valeurs ... Je suis pas sur d'etre tres clair, le mieux c'est encore de trouver un site/tutorial (chez microsoft ?) qui explique clairement ce qui se passe pendant la vie d'une page.

  5. #5
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 75
    Par défaut
    Merci pour tes explications, j'ai compris l'idée principale

  6. #6
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 75
    Par défaut
    En fait je dois écrire les méthodes saveViewState et loadViewState moi-même pour préciser quels sont les objets dont je veux recharger les données, c'est bien ça ? :o

  7. #7
    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
    Non non, tu n'as pas besoin dans ton cas de toucher aux fonction Load et SaveViewstate, tu dois simplement recréer tes colonnes dynamiquement à chaque PostBack AVANT que la fonction LoadViewState n'ait été appelée (par exemple de le PageInit de ta page).

    Pour bien comprendre le viewState il faut imaginer une séquence d'aller-retou vers le serveur :

    1) Le client demande ta page pour la premiere fois

    2) Le serveur exécute la demande :
    a) au moment de l'arrivée de la requete le viewState est vide.
    b) Il fabrique tous tes controles (donc ta DataGrid en l'occurence) ,
    c) il execute ton code qui ajoute des colonnes dynamiquement
    d) Là tu remplies ta DataGrid, probablement avec un DataBind
    e) le SaveViewState sauvegarde dans le viewstate tout ce qui se trouve dans ta DataGrid
    f) envoie de la page au client

    3) Le client renvoie la page (suite à un clic sur un bouton par exemple)
    a) au moment de l'arrivée de la requete, le viewstate contient l'état de ta DataGrid tel que sauvé précedemment
    b) le serveur refabrique tes controles (ta DataGrid)
    c) il charge le viewState dans ta DataGrid. C'est ICI qu'il faut que tu ais déja recréé tes colonnes, sinon pour lui elles n'existent pas !!!

    etc ...


    J'espere que c'est plus clair

  8. #8
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 75
    Par défaut
    Oui, merci, c'est beaucoup plus clair désormais !

  9. #9
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 75
    Par défaut
    J'ai un gros bug quand j'essaie de sauvegarder les données de mon DataGrid daans le ViewState :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.ViewState["cle"] = this.monDataGrid;
    Quand j'arrive sur la page à l'exécutuion, j'ai une erreur "The type 'System.Web.UI.WebControls.DataGrid' must be marked as Serializable or have a TypeConverter other than ReferenceConverter to be put in viewstate"

    Comment faire ? :o

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 166
    Par défaut
    pour pouvoir stocker des objets dans les viewstate il fo que celui-ci puisse etre serialize or une datagrid ne l'est pas ce qui me parrait logique et d'ailleurs j ne comprend pas l'interet de stocker l'objet datagrid dans un viewstate meme dans ton cas.De plus ca sera pénible pour tes utilisateurs car c chez eux que sera tocké la datagrid et ils devront te l'uploader a chaque postback. Donc dans ton cas il faudrait plutot utiliser les sessions mais la encore il ne fo pas stocker le datagrid en entier.

  11. #11
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 75
    Par défaut
    Comment faire alors pour récupérer les valeurs de mes colonnes créées dynamiquement (voir mon premier post sur ce topic) ? :o :o :o

  12. #12
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 75
    Par défaut
    Citation Envoyé par Sphax
    Salut,

    Il faut recréer tes colonnes dynamiques à chaque postBack, de préférence dans le PageInit de ta page (avant le LoadViewState) pour que ça fonctionne.
    Ok mais je dois créer une nouvelle méhode "private void Page_Init(object sender, System.EventArgs e)" ou je mets ça dans la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    override protected void OnInit(EventArgs e)
    		{
    			//
    			// CODEGEN: This call is required by the ASP.NET Web Form Designer.
    			//
    			InitializeComponent();
    			base.OnInit(e);
    		}
    ? :o

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 166
    Par défaut
    il vo mieux que tu le fasses dans l'evenement Page_init

  14. #14
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 75
    Par défaut
    C'est bon ça marche !
    En fait c'était pas compliqué

    Merci pour votre aide

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 310
    Par défaut
    euh tout simplement mettre la création des colonnes dans le Page_Load

  16. #16
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 75
    Par défaut
    Non, dans Page_Init

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 11/06/2013, 10h17
  2. Tri ne marche pas dans une datagrid remplie depuis une BDD
    Par TrexXx dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 15/01/2011, 16h42
  3. Binding avec une Datagrid
    Par cyberbobby dans le forum Windows Presentation Foundation
    Réponses: 5
    Dernier message: 25/07/2009, 13h20
  4. [2.0][VB.NET] Lier un textbox avec une db en dynamique
    Par thierry007 dans le forum Windows Forms
    Réponses: 8
    Dernier message: 30/11/2006, 18h07
  5. Problèmes avec une TForm créée dynamiquement
    Par Pascal Jankowski dans le forum Composants VCL
    Réponses: 5
    Dernier message: 30/03/2005, 11h55

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