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 :

Un GridView qui en commande un autre dans un UpdatePanel


Sujet :

ASP.NET

  1. #1
    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 Un GridView qui en commande un autre dans un UpdatePanel
    Bonjour à tous.

    Je tente de faire une truc peut-être un peu scabreux, mais je patauge depuis Vendredi dessus.

    J'ai fais deux GridView dans un UpdatePanel de la manière suivante :
    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
    <ajax:UpdatePanel ID="upGalerie" runat="server" ChildrenAsTriggers="true" UpdateMode="Always">
        <ContentTemplate>
            <table>
                <tr>
                    <td>
                        <asp:SqlDataSource ID="sdsGalerie" runat="server" ConnectionString="<%$ ConnectionStrings:DataDev %>"></asp:SqlDataSource>
                        <asp:GridView ID="gvGalerie" runat="server" DataSourceID="sdsGalerie" DataKeyNames="IdGalerie"></asp:GridView>
                    </td>
                    <td>
                        <asp:SqlDataSource ID="sdsDetailGalerie" runat="server" ConnectionString="<%$ ConnectionStrings:DataDev %>"></asp:SqlDataSource>
                        <asp:GridView ID="gvDetailGalerie" runat="server" DataSourceID="sdsDetailGalerie" DataKeyNames="IdPhotoAntoine" ></asp:GridView>
                    </td>
                </tr>
            </table>
        </ContentTemplate>
    </ajax:UpdatePanel>
    Ensuite je charge mon premier GridView à partir du CodeBehind comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
            With sdsGalerie
                .SelectCommand = "SELECT * FROM ANTOINE_Galerie"
            End With
            With gvGalerie
                Dim btn As New ButtonField
                With btn
                    .Text = "modifier"
                End With
                .Columns.Add(btn)
                .DataBind()
     
            End With
        End Sub
    En ajoutant simplement un bouton modifier pour ouvrir et charger le deuxième gridView en fonction de la ligne choisie. L'action se fait comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        Protected Sub gvGalerie_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles gvGalerie.RowCommand
            With sdsDetailGalerie
                .SelectCommand = "SELECT * FROM ANTOINE_Galerie_Photo WHERE IdGalerie = '" & gvGalerie.DataKeys(e.CommandArgument).Value.ToString & "'"
            End With
            With gvDetailGalerie
                .AutoGenerateEditButton = True
                .DataBind()
     
            End With
        End Sub
    Le GridView se charge trés correctement avec les bonnes données.
    Le problème arrive maintenant : j'ai activé l'EditButton mais si je clique dessus le GRidView disparait, tout simplement.

    Donc j'en déduis que je dois oublier de recharger un truc quelque part, mais là, je sèche, je ne vois pas quoi du tout.

    Pouvez m'aider ?

  2. #2
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Août 2004
    Messages : 60
    Par défaut
    Quand tu clique sur le bouton EDIT tu déclenche un postback, et si ta grille devient vide, c'est parce que l'état de la datasource n'a pas été correctement conservé (par le viewstate ?) et donc ta grille se réinitialise à son état initial.

    Essaye de stocker l'identifiant du "détail" sélectionné dans ta session ASP.NET, et ensuite effectue un rechargement avec la requête SELECT qui va bien à chaque postback (par exemple, dans l'événement INIT) et ça devrait marcher.

  3. #3
    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
    Merci pour ton aide. J'ai réussi à avancer et maintenant je vois bien mon deuxième GridView rempli. Lorsque je clique sur "editer" ça marche, j'ai les champs de saisi.
    C'est lorsque je clique sur "mettre à jour" (donc une fois les modifications saisies" qu'il ne se passe rien, mais rien du tout.
    Donc j'ai modifié mon code comme cela :
    j'ai fais une procédure pour gérer le chargement 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
    Sub ChargeGV(ByVal idGalerie As String)
            Try
                If idGalerie <> "" Then
                    With sdsDetailGalerie
                        .SelectCommand = "SELECT * FROM ANTOINE_Galerie_Photo WHERE IdGalerie = '" & idGalerie & "'"
                        .UpdateCommand = "UPDATE ANTOINE_Galerie_Photo SET NomFichier = @NomFichier, AlternateTexte = @AlternateTexte, OrdrePhoto = @OrdrePhoto WHERE IdPhotoAntoine = @IdPhotoAntoine"
                    End With
                    With gvDetailGalerie
                        .AutoGenerateEditButton = True
                        .DataBind()
                    End With
                End If
            Catch ex As Exception
                Logage("Message d'erreur : " & ex.Message)
            End Try
     
        End Sub
    En amont, dans le RowCommande du premier grid View je charge la variable de session comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     Protected Sub gvGalerie_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles gvGalerie.RowCommand
            Session("idGalerie") = gvGalerie.DataKeys(e.CommandArgument).Value.ToString
            ChargeGV(gvGalerie.DataKeys(e.CommandArgument).Value.ToString)
                End Sub
    Et dans le RowCommand du deuxième GridView je recharge le GridView, tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Protected Sub gvDetailGalerie_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles gvDetailGalerie.RowCommand
            ChargeGV(Session("idGalerie"))
     
        End Sub
    Du coup, est-ce que le problème ne viendrais pas de là ?
    Si oui, comment le contourner, je suis paumé dans le chemin de vie du GridView.

    Merci pour ton aide.

  4. #4
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Août 2004
    Messages : 60
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            ChargeGV(Session("idGalerie"))
    Je pense que tu devrais appeler cette méthode dans l'événement PageInit, pour être sûr que le second gridview (détail) est toujours correctement initialisé.

    Là, je crois que tu l'appelle en cas de commande "EDIT" sur la grille détail, mais pas dans les autres cas (ex: ton fameux UPDATE qui ne marche pas).

  5. #5
    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
    Ok, j'ai rajouté dans l'Init pour être sûr et je l'ai mis aussi dans tout les Case du select.
    Et là, il me supprimait les modifications lors du click sur "mettre à jour". Du coup, j'ai viré du Case "Upadte" et de l'Init et ça amrche un poil mieux, disons qu'il ne supprime plus les modifications.

    Maintenant mon RowCommand ressemble à cela :
    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
    Protected Sub gvDetailGalerie_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles gvDetailGalerie.RowCommand
            Select Case e.CommandName
                Case "Update"
                    ChargeGV(Session("idGalerie"))
                    Try
                        gvDetailGalerie.UpdateRow(e.CommandArgument, False)
                    Catch ex As Exception
                        Logage(ex.Message)
                    End Try
                Case "Edit", "Cancel"
                    ChargeGV(Session("idGalerie"))
                Case Else
                    ChargeGV(Session("idGalerie"))
            End Select
        End Sub
    Et le message d'erreur arrive et dit cela :
    La source de données 'sdsDetailGalerie' ne prend pas en charge la mise à jour sauf si UpdateCommand est spécifié.
    Sauf que dans mon sds je lui mets cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    With sdsDetailGalerie
                        .SelectCommand = "SELECT * FROM ANTOINE_Galerie_Photo WHERE IdGalerie = '" & idGalerie & "'"
                        .UpdateCommand = "UPDATE ANTOINE_Galerie_Photo SET NomFichier = @NomFichier, AlternateTexte = @AlternateTexte, OrdrePhoto = @OrdrePhoto WHERE IdPhotoAntoine = @IdPhotoAntoine"
                    End With
    Ce qui, il me semble, spécifie un UpdateCommand. Et du coup, je suis paumé, encore une fois. Les SDS et le GV sont rechargés juste avant le UpdateRow, les paramètres requis sont inscrits et tout est en place.
    Je vois pas ce qu'il lui faut d'autre.

    Merci pour ton aide.

  6. #6
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Août 2004
    Messages : 60
    Par défaut
    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
    Protected Sub gvDetailGalerie_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles gvDetailGalerie.RowCommand
            Select Case e.CommandName
                Case "Update"
                    ChargeGV(Session("idGalerie"))
                    Try
                        gvDetailGalerie.UpdateRow(e.CommandArgument, False)
                    Catch ex As Exception
                        Logage(ex.Message)
                    End Try
                Case "Edit", "Cancel"
                    ChargeGV(Session("idGalerie"))
                Case Else
                    ChargeGV(Session("idGalerie"))
            End Select
        End Sub

    Petite remarque, ce code n'est pas très lisible car il y a plein de case mais ils font presque tous la même chose (recharger la grille).
    De plus, je ne suis pas sur que tu ai besoin de recharger la grille ici, car elle l'a déjà été par le PageInit().

    Essaye de mémoriser l'ordre dans lequel les événements ASP.NET sont levés, c'est indispensable :
    http://msdn.microsoft.com/fr-fr/libr...=vs.80%29.aspx
    http://msdn.microsoft.com/en-us/library/ms178472.aspx

  7. #7
    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
    Merci pour ton aide.

    Je me suis mal expirmé dans mon précédent post. Dans le Init je retiré le ChargeGv parce qu'il générait une supression des modifications apportées au moment du click, au même titre que sa présence de case Update.
    Du coup il n'y a plus les ChargeGV dans le INIT et dans le Case Update.


    Mais là, cas qui bloque c'est surtout qu'il me dise qu'il faut précise le UpdateCommand alors qu'il est précisé. Enf ait le problème vient surtout de là plutôt que l'ordre des évènements.

    Les messages d'erreur est clair mais pas cohérent avec la réalité. Il me dit trés précisément qu'il ne peut pas faire la mise à jour de la ligne parce que le UpdateCommand n'est pas précisé, mais je l'ai fait dans le code sur ChargeGV.

    Vois tu le problème ?

    Merci pour ton aide.

Discussions similaires

  1. Réponses: 3
    Dernier message: 08/04/2008, 20h50
  2. Réponses: 4
    Dernier message: 31/01/2008, 18h22
  3. Réponses: 2
    Dernier message: 07/12/2007, 15h20
  4. Réponses: 1
    Dernier message: 27/07/2007, 15h37
  5. Réponses: 3
    Dernier message: 12/04/2006, 20h44

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