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 :

Le GridView qui ne prend pas le commandArgument dans le bon sens


Sujet :

ASP.NET

  1. #1
    Membre extrêmement actif
    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 : 53
    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
    Points : 1 434
    Points
    1 434
    Par défaut Le GridView qui ne prend pas le commandArgument dans le bon sens
    Bonjour tout le monde.

    Là je suis confronté à un souci que j'ai beaucoup de mal à comprendre non seulement parce qu'il est bizarre mais en plus, je ne trouve pas sa logique.

    Alors posons les éléments :
    j'ai une proc stock qui me retourne des donéne sous cette forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT IdPublicite, NomCategorie, NomRegie, TitrePub
    FROM dbo.Publicite
    J'ai posé un SQlDataSource et un GridView côté HTML comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <asp:SqlDataSource ID="sdsListeConcours" runat="server" ConnectionString="<%$ ConnectionStrings:DataCon %>"></asp:SqlDataSource>
    <asp:GridView ID="gvListeConcours" runat="server" DataKeyNames="IdPublicite" Width="100%"></asp:GridView>
    Ensuite je rempli tout ce petit monde comme ça :
    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
     
    With sdsListeConcours
                .SelectCommand = "EXEC maProc"
            End With
            Dim btn As New ButtonField
            With btn
                .Text = "Modifier"
                .CommandName = "Modifier"
                .ButtonType = ButtonType.Button
            End With
            With gvListeConcours
                .AllowPaging = True
                .PageSize = 20
                With .PagerSettings
                    .Mode = PagerButtons.NumericFirstLast
                    .Position = PagerPosition.Bottom
                    .PageButtonCount = 5
                End With
                .DataSource = sdsListeConcours
                .Columns.Add(btn)
                .DataBind()
     
                .EmptyDataText = "Pas de concours disponible"
            End With
    Ensuite je dis au bouton de m'envoyer sur une autre page avec un argument en Query
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        Protected Sub gvListeConcours_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles gvListeConcours.RowCommand
            Select Case e.CommandName
                Case "Modifier"
                    Response.Redirect(GetPage("GestionConcours", enTypeRetour.Lien) & "&idconcours=" & gvListeConcours.DataKeys(e.CommandArgument).Value)
            End Select
        End Sub
    La Function GetPage() retourne une chaine qui se fabrique à partir d'info de la base de donnée et qui permet au REsponse.REdirect de fonctionner correctement. Ce point fonctionne correctement.

    Le souci vient certainement du Paging. Tant que je suis sur la première page de donnée du GV, ça va. Dés que je passe sur la suivante il me renvoi les IdPublicité de la première page. Je ne comprend pas cette logique.

    Pour gérer la changement de page j'ai fait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        Protected Sub gvListeConcours_PageIndexChanging(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewPageEventArgs) Handles gvListeConcours.PageIndexChanging
            gvListeConcours.PageIndex = e.NewPageIndex
            gvListeConcours.DataBind()
        End Sub
    Classique en gros.

    Est ce q'uil y a un détail qiu m'échappe sur la gestion du changement de page ?

    Merci pour votre aide.
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  2. #2
    Expert confirmé
    Avatar de Nicolas Esprit
    Homme Profil pro
    Consultant en technologies
    Inscrit en
    Février 2010
    Messages
    1 467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en technologies
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 1 467
    Points : 4 066
    Points
    4 066
    Par défaut
    Bonjour,

    Une question, à quel moment appelles-tu la partie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With sdsListeConcours
        .SelectCommand = "EXEC maProc" 
        ...
    Le fais-tu à chaque chargement de page ? Le PostBack est bien géré ?

    Sinon, pourquoi paramètres-tu ta Gridview dynamiquement dans le code-behind ? C'est une contrainte dans ton application ? La plus simple reste encore de la paramétrer dans le markup de ta page.

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

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Points : 8 734
    Points
    8 734
    Par défaut
    Tu dois repager ton grid avant de faire le response.redirect

  4. #4
    Membre extrêmement actif
    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 : 53
    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
    Points : 1 434
    Points
    1 434
    Par défaut
    @Nicolas : je fais cela dans le Init du composant. je ne gère pas pas particulièrement le PostBack, en le laissant faire tout seul il me donne satisfaction (dans ce cas précis).

    Je le fais en codeBehind car les paramettres de ma Proc Stock sont dynamiques, donc pas (ou difficilement) gérable côté HTML.

    Cela répond il à tes interrogations ?

    @Lutecefalco : c'est quoi "repager". Si je remets la même commande que dans le PageIndexChanging il veut pas, puisque le e.NewPageIndex n'est pas disponible.

    Merci pour votre aide les gars.
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

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

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Points : 8 734
    Points
    8 734
    Par défaut
    Citation Envoyé par zooffy Voir le message

    @Lutecefalco : c'est quoi "repager". Si je remets la même commande que dans le PageIndexChanging il veut pas, puisque le e.NewPageIndex n'est pas disponible.

    Merci pour votre aide les gars.
    Quand tu changes de page, stocke le e.NewPageIndex dans le ViewState.
    Dans ton RowCommand, rend toi sur la page dont l'index est stocké dans le ViewState avant de faire ton action

  6. #6
    Membre extrêmement actif
    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 : 53
    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
    Points : 1 434
    Points
    1 434
    Par défaut
    Merci pour ton aide Lutecefalco.

    Je vois à peu pres ce que tu veux que je fasse mais j'ai deux soucis :
    - stocker un truc dans le ViewState je ne sais pas faire. J'avoue et je suis conscient que c'est une connerie, que je n'utilise pas le ViewState pour cause de "je sais pas comment ça marche". Les doc que je trouve sur le sujet sont trés obscur pour moi, je ne trouve pas de tuto avec des exemples bien pragmatique, tout ce que je trouve est trés théorique.
    - manipuler les pages du GV, je n'y arrive pas, à chaque fois il me dit que l'obejt n'est pas lié à une instance d'un objet.... Je dois pas utiliser les bonnes commandes ou je dois oublier de dimensionner un objet au préalable. Un exemple de code serait le bien venu sur ce coup là.

    Passe un bon Dimanche.
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

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

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Points : 8 734
    Points
    8 734
    Par défaut
    Le viewstate, tu t'en sers comme la session:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    private int? CurrentPageIndex
            {
                get
                {
                    return ViewState["pageIndex"] as int?;
                }
                set
                {
                    ViewState["pageIndex"] = value;
                }
            }

  8. #8
    Membre extrêmement actif
    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 : 53
    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
    Points : 1 434
    Points
    1 434
    Par défaut
    Merci Lutecefaco

    Bon, alors leViewState va certainement me réserver encore quelques surprises, mais j'ai réussi à faire ce qu'il faut pour que ça marche. J'affiche le bon truc maintenant.

    Sur le ViewState, c'est donc comme la variable de session. Mais alors, je peux envoyer tout ce que je veux dedans ?

    Là j'ai fais comme suit :
    Dans mon changement d'index
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        Protected Sub gvListeConcours_PageIndexChanging(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewPageEventArgs) Handles gvListeConcours.PageIndexChanging
            ViewState("IndexPage") = e.NewPageIndex
            With gvListeConcours
                .PageIndex = e.NewPageIndex
                .DataBind()
            End With
        End Sub
    Et dans mon RowCommand :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        Protected Sub gvListeConcours_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles gvListeConcours.RowCommand
            Select Case e.CommandName
                Case "Modifier"
                    gvListeConcours.PageIndex = ViewState("IndexPage")
                    gvListeConcours.DataBind()
     
                    Response.Redirect(GetPage("GestionConcours", enTypeRetour.Lien) & "&idconcours=" & gvListeConcours.DataKeys(e.CommandArgument).Value)
            End Select
        End Sub
    En gros, j'envoi un Integer brut dans le ViewState. Peut-être devrais je le déclarer ou le typer ? Si oui, comment je fais ? (premier truc que j'ai pas compris)

    Et au delà de ce cas, est ce que je peux envoyer un objet ou un contrôle ?
    Par exemple (code pourri)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Dim unObjet as New Label
    unObjet.Text = "toto"
     
    ViewState("unObjetDedans") = unObjet
    Je mets ça dans le Init (par exemple) et ailleur, dans un click de Button (par exemple) je récupère
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Dim unLabel as Label = ViewState("unObjetDedans")
    'ou éventuellement avec un CType
    J'ai bon avec un truc comme ça ?


    Désolé de pas capter plus vite, mais le ViewState est une nouveauté pour moi. J'avoue que je ne m'en était pas soucié jusqu'à présent et je découvre que c'est une erreur.
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

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

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Points : 8 734
    Points
    8 734
    Par défaut
    On stocke un objet dans le viewstate. Il doit donc être sérialisable.
    A toi de caster lors du get seulement

  10. #10
    Membre extrêmement actif
    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 : 53
    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
    Points : 1 434
    Points
    1 434
    Par défaut
    Ok, merci pour tout.
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 07/01/2007, 12h03
  2. Texte qui ne prend pas la bonne couleur
    Par lodan dans le forum Mise en page CSS
    Réponses: 24
    Dernier message: 20/09/2006, 09h05
  3. [Tableaux] Variable qui ne prend pas sa valeur
    Par stephane78 dans le forum Langage
    Réponses: 11
    Dernier message: 19/08/2006, 20h30
  4. [JAR] Archive qui ne prend pas en compte librairie externe
    Par Shiryu44 dans le forum Général Java
    Réponses: 3
    Dernier message: 22/04/2005, 13h59
  5. [JFrame] événement qui ne prend pas
    Par Ymer dans le forum Agents de placement/Fenêtres
    Réponses: 9
    Dernier message: 24/11/2004, 13h54

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