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 :

Récupération d'un Identifiant dans un GridView pour faire un CommandArgument


Sujet :

ASP.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 Récupération d'un Identifiant dans un GridView pour faire un CommandArgument
    Bon, alors je suis avec une histoire de GRidView pour fiare un module de messagerie. L'idée est davoir un tableau qui présente la liste des mesage avec Emmetteur, Date et sujet. En bout de ligne on mets deux boutons pour :
    - voir le détail
    - supprmier le message

    Mon souci est le suivant : je n'arrive pas à lui envoyer l'identifiant du mesage (celui dans la table dans la BDD) que je remonte ans mon RecordSet.

    J'avais fait un truc avec un champ en début de GridView que je cachais par du CSS, mais je trouve que c'est pas propre et surtout j'ai découvert le DataItem().

    J'ai donc tenté un truc bien, mais j'ai mesasge d'erreur qui me laisse perplexe.
    Voici le code mon GRidView côté HTML :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <asp:SqlDataSource ID="sdsMessagerie" runat="server" ConnectionString="<%$ ConnectionStrings:DataDev %>"></asp:SqlDataSource>
    <asp:GridView ID="gvMessagerie" runat="server" DataSourceID="sdsMessagerie"></asp:GridView>
    Puis le CodeBehind pour le CommandArgument :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Protected Sub gvMessagerie_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles gvMessagerie.RowCommand
            Select Case e.CommandName
                Case "DetailMessage"
                    Response.Redirect(GetPage("DetailMessage", enTypeRetour.html) & "&idmsg=" & gvMessagerie.Rows(e.CommandArgument).DataItem(0).ToString)
                Case "SuppMessage"
                    Dim suppMSG As Int16 = New DManager("DataDev").RetournerScalaire("EXEC SITE_Messagerie_SuppMSG " & gvMessagerie.Rows(e.CommandArgument).Cells(0).Text & ",'" & Mode & "'")
                    gvMessagerie.DataBind()
     
                Case Else
            End Select
        End Sub
    Vous pouvez voir dans la cas de SuppMessage, l'ancienne méthode.
    Par contre, le DetailMessage génère le message suivant :
    Variable objet ou variable d'un bloc With non définie.
    Je ne comprends pas ce message. Pouvez vous m'aider ?

  2. #2
    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 viens de refaire quelques essais et je ne comprends pas du tout. J'ai l'impression qu'il bloque sur l'accès au DataItem de la Row concernée.

    Voici un exemple de code tout simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Dim gv As GridView = sender
    Dim dr As GridViewRow = gv.Rows(e.CommandArgument)
    Logage(dr.DataItem(0))
    Ma Procédure Logage inscrit dans un fichier texte les choses que je lui envoi sous forme de chaine. Et lorsqu'il passe à cette ligne, il me met le même message d'erreur toutjours aussi incompréhensible :
    Variable objet ou variable d'un bloc With non définie.
    J'ai tout déclaré, je ne vois pas de quel objet il veut parler.

    Vous avez une idée ?

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    "dr.DataItem(0)" : ça n'a pas de sens... DataItem est déclaré en tant qu'Object, tu ne peux pas utiliser un indexeur dessus

    De plus, si tu regardes en debug la valeur de DataItem, tu verras que c'est toujours Nothing (en tous cas quand tu utilises un SqlDataSource comme source de données). Oui je sais, c'est aberrant

  4. #4
    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
    Donc, si je comprends bien ce que tu dis, je ne peux pas faire ce que je faire pour récupérer une donnée de mon RecordSet qui n'est pas affichée dans mon GRidView ?

    Mais alors pourquoi j'arrive à faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Protected Sub gvMessagerie_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles gvMessagerie.RowDataBound
            If e.Row.RowType = DataControlRowType.DataRow Then
                If e.Row.DataItem(5).ToString = "0" Then
                    e.Row.CssClass = "MESSAGERIE_MsgLu"
                End If
            End If
        End Sub
    La différence c'est que je suis dans le DataRowBound et pas dans le RowCommand, mais je reste sur un évènement lié à une ligne.
    C'est ça que je capte pas.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Ah ok...
    En fait au moment du binding, DataItem vaut effectivement quelque chose... c'est en général un DataRowView. Comme VB.NET accepte le late-binding, l'indexeur est évalué à l'exécution et ça passe...
    Mais pour une raison qui m'échappe, lors du postback les DataItem ne pointent plus vers les DataRowView correspondants

    Pour récupérer la valeur d'un champ en particulier, je fais comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            Sub GridView1_RowCommand(sender As Object, e As GridViewCommandEventArgs)
                Dim iRow As Integer = Convert.ToInt32(e.CommandArgument)
                Dim row As GridViewRow = GridView1.Rows(iRow)
                Dim key As String = row.Cells(0).Text
                ...
            End Sub
    (en remplaçant 0 par l'index du champ en question)

  6. #6
    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.

    En fait, le code que tu propose c'est ce qe je fais déjà, sauf que je le fait manière plus directe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    gvMessagerie.Rows(e.CommandArgument).Cells(0).Text
    Mais ceci oblige à afficher dans une colonne du GridView le champ de donnée dont tu as besoins. Hors, ce que je cherche c'est à récupérer une donnée qui se trouve dans le RecordSet mais pas affichée dans le GridView.

    L'autre ennui c'est que je n'arrive pas à suivre ton explication de départ, j'ai pas le niveau. Pourquoi un PostBack "casserais" la liaison avec les données à cette endroit et pas dans le DataRowBound ?
    Et le "Late-Binding" c'est quoi ?
    Et un "indexeur", c'est quoi ?

    Autant je commence à bien maitriser certains point du FrameWork et de la programmation en VB.NET, autant certains concept profond, comme ce que tu décris m'échappe encore.

Discussions similaires

  1. Réponses: 2
    Dernier message: 23/12/2013, 15h34
  2. [MySQL] Problème avec la récupération d'une variable dans un lien pour un panier
    Par roy-mustang dans le forum PHP & Base de données
    Réponses: 0
    Dernier message: 23/06/2011, 13h58
  3. [MySQL] Récupération de l'identifiant dans l'adresse
    Par Misoss dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 27/02/2008, 18h51
  4. Modification d'un champ dans un gridview pour l'update
    Par Aumélisse dans le forum ASP.NET
    Réponses: 3
    Dernier message: 23/08/2007, 14h17
  5. Récupération de l'identifiant dans un label
    Par DaisyVIP dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 24/05/2007, 14h18

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