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

  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 : 54
    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 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 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 : 54
    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
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    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 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 : 54
    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
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    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 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 : 54
    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.

    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.

  7. #7
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par zooffy Voir le message
    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.
    arf... En fait il faudrait récupérer l'info directement dans la source de données, mais le problème est justement que tu n'y as plus directement accès lors du postback. Peut-être qu'un gvMessagerie.DataBind dans le Page_Load résoudrait le problème, mais pour les performances c'est pas génial.

    Citation Envoyé par zooffy Voir le message
    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 ?
    Le "pourquoi", je ne sais pas trop... c'est simplement quelque chose que j'ai observé. Chaque postback provoque une nouvelle exécution du code de la page, et la source de données n'est pas conservée dans le ViewState de la page entre 2 exécutions. Comme je l'ai dit plus haut, tu peux essayer de rebinder dans le Page_Load

    Citation Envoyé par zooffy Voir le message
    Et le "Late-Binding" c'est quoi ?
    http://msdn.microsoft.com/fr-fr/library/0tcf61s1.aspx
    C'est la "liaison tardive" en français. En gros, le compilateur VB.NET t'autorise à appeler une méthode Toto sur une variable de type Object, bien que le type Object ne déclare pas de méthode Toto. C'est à l'exécution que la méthode Toto va être recherchée sur le type réel de l'objet. Si l'objet en question n'a pas de méthode Toto, ça provoquera une exception. Avec un langage qui n'autorise pas le late-binding, ça aurait provoqué une erreur à la compilation. (l'explication est valable aussi pour un champ, un évènement ou une propriété)

    Citation Envoyé par zooffy Voir le message
    Et un "indexeur", c'est quoi ?
    En fait c'est plutôt un concept C# que VB, même si l'équivalent existe en VB. Ca correspond à la propriété Item que tu as dans toutes les collections. En gros, "dr.DataItem(0)" revient à écrire "dr.DataItem.Item(0)". C'est juste une propriété particulière de l'objet.

  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 : 54
    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 ces explications.
    Je vais me contenter de ce que je fais avec ma colonne cachée par CSS, mais c'est vraiment pas propre.
    Si y a d'autres idées ......................

  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
    Perso je stocke l'ID dans une colonne cachée du grid view

  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 : 54
    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 LuteceFalco.

    Donc, pas moyen de pointer sur la source de donnée pour ne pas avoir à afficher puis cacher un donnée.

    Rha, c'est vraiment pas propre. Parce que, ce qui me fais un peu peur c'est l'utilisation du CSS pour cacher la colonne qui ne sera pas forcément utilisé de la même manière par tous les navigateurs. Ou alors faut faire une loi qui oblige tout le monde à utiliser IE

  11. #11
    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
    Je cache ma colonne avec Visible=false coté design.
    Je pense pas qu'elle soit rendue coté client

  12. #12
    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 : 54
    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
    Alors, peut être que côté Design, ça le fais, mais je fabrique mon GridView en CodeBehind et en mettant le Visible à False, ben il ne trouve plus le contenu de la Cellule. C'est pour ça que je passe par du CSS pour la cacher.

  13. #13
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Ouais, c'est clair que c'est pas très propre comme façon de faire... Je suis relativement nouveau dans le monde d'ASP.NET (je faisais surtout du WinForms avant), et pour l'instant je suis pas super convaincu... j'ai l'impression de toujours devoir recourir à des bidouilles pour arriver à mes fins. Mais c'est peut-être que je m'y prends mal...
    En tous cas si tu finis par trouver une solution propre, je suis preneur !

    Au fait, ma suggestion de refaire un DataBind dans le Form_Load ne change rien à l'affaire

  14. #14
    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
    Je pense que la solution est de passer par la propriété DataKeyNames du gridview
    Après, code behind, tu peux faire (sans avoir de colonne ID)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int productID = (int)SuppliersProducts.DataKeys[Convert.ToInt32(e.CommandArgument)].Value;

  15. #15
    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 : 54
    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
    Alors, le DataBind dans le Form_Load ça marche pas mieux.

    Par contre, le DataKey ça marche bien, même trés bien.
    Mais cela ne reste valable que pour récupérer la donnée que l'on a placé dans le DataKeyName du GridView (en général l'Id de table).

    Alors du coup, si je veux taper sur une autre donnée du RecordSet, comment je pourrais faire ?

    Ma première idée serait de relancer une requête pour aller cherche l'info en partant de l'ID que j'ai stocké en DataKey, mais il n'y aurait pas une méthode plus perfomante et moins bidouilleuse ?

    J'ai un peu la même impression que toi, Tomlev, je fais pas mal de "bidouille" pour arriver à mes fins. Je suis tiraillé entre deux sentiments : méconnaissance du FrameWork et de ses objets et atteinte des limites de ce que peux faire le FrameWork.

    Bon en tout cas, j'ai au moins une solution pour mon problème précis, mais j'aimerais bien avoir une autre solution pour d'autres données.

    Je bouclerais le topic si aucune autre solution ne se fait connaitre d'ici quelques jours.

    PS : LuteceFalco : même pas peur our la translation du code C# en V.NET

  16. #16
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    ah oui tiens, DataKeyNames... comment ça a pu m'échapper

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