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 :

Accès aux contrôles d'un gridview dans un gridview


Sujet :

ASP.NET

  1. #1
    Membre régulier Avatar de Stephane_br
    Inscrit en
    Septembre 2005
    Messages
    222
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 222
    Points : 83
    Points
    83
    Par défaut Accès aux contrôles d'un gridview dans un gridview
    Bonjour,

    Je débute en .NEt et je ne comprend pas comment accéder aux contrôles d'un gridview imbriqué dans un autre gridview.
    Je m'explique. Sur ma page web en ASP.NET / VB.NET, j'ai un premier gridview qui m'affiche une liste de produits avec leur caractéristiques ....
    A l'intérieur de ce gridview, pour chaque produit (chaque ligne), j'ai un autre gridview qui lui liste des tarifs liés à ce produit.

    Pour mieux comprendre, j'ai ceci sur la page web produits.aspx :
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
          <asp:GridView ID="ProdsView"
          CssClass="GammeViewStyle"
          AutoGenerateColumns="false"
          GridLines="Horizontal"
          onrowdatabound="ProdsView_RowDataBound"
          runat="server"
          cellpadding="0"
          cellspacing="0"
          ShowHeader="false">
          <columns>
          <asp:TemplateField ItemStyle-Width="100%" ItemStyle-HorizontalAlign="left" ItemStyle-CssClass="GammeBlocProduit">
          <itemtemplate>
         
    
         <asp:Label ID="LabelGammeTitreProduit" runat="server" Text="Désignation Article" />
          ....
    
              <asp:GridView ID="TarifsView"
              CssClass="GammeBlocTarifsView"
              AutoGenerateColumns="false"
              GridLines="Horizontal"
              onrowdatabound="TarifsView_RowDataBound"
              runat="server"
              cellpadding="0"
              cellspacing="0"
              ShowHeader="false" onselectedindexchanged="TarifsView_SelectedIndexChanged">
              <columns>
              <asp:TemplateField ItemStyle-Width="100%" ItemStyle-HorizontalAlign="left" ItemStyle-CssClass="GammeBlocTarifsView">
              <itemtemplate>
               
    
               <asp:Label ID="LabelTarif" runat="server" Text="Prix : XX.XX € TTC" CssClass="TexteTarif" />
               ....
    
              </itemtemplate>
              </asp:TemplateField>
              </columns>
              </asp:GridView>
    
    
    
          </itemtemplate>
          </asp:TemplateField>
          </columns>
          </asp:GridView>
    Concernant le code behind de ma page produits.aspx.vb,
    pour le premier Gridview (ProdsView) j'accède aux contrôles sans aucun problème, tout fonctionne comme ceci par exemple :

    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
    Protected Sub ProdsView_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles ProdsView.RowDataBound
            If e.Row.RowType = DataControlRowType.DataRow Then
                
                 Dim ProdDesignation As Label = CType(e.Row.FindControl("LabelGammeTitreProduit"), Label)
                 Dim strProdDesignation As String = CStr(DataBinder.Eval(e.Row.DataItem, "ProdDesignation"))
                 ProdDesignation.Text = strProdDesignation
    
                 ' remplissage de mon second gridview
                 Dim GridViewTarifs As GridView = CType(e.Row.FindControl("TarifsView"), GridView)
                 Dim objProd As New Products
                 Dim DtTarifsProds As DataSet = objProd.GetTarifsFromProduct(ProdId)
                 GridViewTarifs.DataSource = DtTarifsProds
                 GridViewTarifs.DataBind()
    
    
            End If 
    End Sub
    Par contre, pour le second gridview (TarifsView), impossible d'y accéder de la même manière.
    Si je met :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    Protected Sub TarifsView_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles 
    
    TarifsView.RowDataBound
    
    ...
    
    End Sub
    il me met en rouge TarifsView (voir dans le code ci-dessus) et me met :
    La Claude Handles requiert une variable WithEvents définie dans le type conteneut ou l'un de ses types de base
    Comment rajouter ce quelque chose dans le code de "ProdsView_RowDataBound()" ??? je ne vois pas du tout

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Points : 2 201
    Points
    2 201
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Protected Sub TarifsView_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles C'est ici qui manque un truc
    J'ai mis en rouge ou doit se situer l'erreur après le handle il doit avoir l'objet.evenement auquel est rataché la fonction (notes: Tu peux ratacher plusieurs objet.evenement à la meme fonction)

    Une façon simple de réparer ça et d'utiliser le designer et dans la liste des évenements de TarifsView reslectionner (et non pas double click) la fonction sur l'evenement RowDataBound (A voir le nom de la fonction.)

  3. #3
    Membre éclairé Avatar de methylene
    Profil pro
    Inscrit en
    Février 2010
    Messages
    659
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2010
    Messages : 659
    Points : 813
    Points
    813
    Par défaut
    Salut,

    Comment instancies-tu ton 2ème GridView (par le code ou par le mode création ?).

    Si c'est par le code poste la ligne de code "Dim ...".

    Sinon autre raison qui doit être la bonne, pourquoi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TarifsView.RowDataBound
    n'est-il pas rattaché directement au Handle (si tu préfères pourquoi n'est-il pas sur la même ligne ?)

    Devrait être :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Protected Sub TarifsView_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles TarifsView.RowDataBound
    moi je dirais que tu as du faire un "enter" après le Handle sans faire exprès et donc que cela t'a envoyé la suite du handle sur la ligne suivante --> erreur !

  4. #4
    Membre régulier Avatar de Stephane_br
    Inscrit en
    Septembre 2005
    Messages
    222
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 222
    Points : 83
    Points
    83
    Par défaut
    Citation Envoyé par sinople Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Protected Sub TarifsView_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles C'est ici qui manque un truc
    J'ai mis en rouge ou doit se situer l'erreur après le handle il doit avoir l'objet.evenement auquel est rataché la fonction (notes: Tu peux ratacher plusieurs objet.evenement à la meme fonction)

    Une façon simple de réparer ça et d'utiliser le designer et dans la liste des évenements de TarifsView reslectionner (et non pas double click) la fonction sur l'evenement RowDataBound (A voir le nom de la fonction.)

    Merci pour ta réponse.
    Cependant, je ne comprend toujours pas.
    Faut-il que je mette ceci : ???
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Protected Sub TarifsView_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles ProdsView.RowDataBound
     
    ....
     
        End Sub
    Dans ce cas, c'est lié à l'autre évènement ? Je n'y arrive pas ...
    En mode design dans Visual Studio ou dans la page du code behind, Visual Studio ne semble pas voir mon gridview "tarifview" pour me proposer de générer un évènement lié à lui

  5. #5
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Points : 2 201
    Points
    2 201
    Par défaut
    La tu as un syntaxe correct!

    C'est à dire un function qui est rattachée a un evenement d'un objet!

    Par contre si le nom des objets est correct (et que ça a un sens au point de vue algo) j'ai pas poussé aussi loin.

  6. #6
    Membre éclairé Avatar de methylene
    Profil pro
    Inscrit en
    Février 2010
    Messages
    659
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2010
    Messages : 659
    Points : 813
    Points
    813
    Par défaut
    Hummmm, je ne comprend pas tout.

  7. #7
    Membre régulier Avatar de Stephane_br
    Inscrit en
    Septembre 2005
    Messages
    222
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 222
    Points : 83
    Points
    83
    Par défaut
    Citation Envoyé par methylene Voir le message
    Salut,

    Comment instancies-tu ton 2ème GridView (par le code ou par le mode création ?).

    Si c'est par le code poste la ligne de code "Dim ...".

    Sinon autre raison qui doit être la bonne, pourquoi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TarifsView.RowDataBound
    n'est-il pas rattaché directement au Handle (si tu préfères pourquoi n'est-il pas sur la même ligne ?)

    Devrait être :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Protected Sub TarifsView_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles TarifsView.RowDataBound
    moi je dirais que tu as du faire un "enter" après le Handle sans faire exprès et donc que cela t'a envoyé la suite du handle sur la ligne suivante --> erreur !
    Pas de pb de saut de ligne.
    Mon second gridview (TarifsView), je le déclare dans la fonction ProdsView_RowDataBound() de mon premier gridview comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim GridViewTarifs As GridView = CType(e.Row.FindControl("TarifsView"), GridView)
    Dim objProd As New Products
    Dim DtTarifsProds As DataSet = objProd.GetTarifsFromProduct(ProdId)
    GridViewTarifs.DataSource = DtTarifsProds
    GridViewTarifs.DataBind()

  8. #8
    Membre éclairé Avatar de methylene
    Profil pro
    Inscrit en
    Février 2010
    Messages
    659
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2010
    Messages : 659
    Points : 813
    Points
    813
    Par défaut
    Ok, je reviens vers ma première idée, que penserais-tu de déclarer ta GridView de cette façon là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Friend WithEvents GridViewTarifs As GridView = CType(e.Row.FindControl("TarifsView"), GridView)
    Qui incluerait les évènements.

  9. #9
    Membre régulier Avatar de Stephane_br
    Inscrit en
    Septembre 2005
    Messages
    222
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 222
    Points : 83
    Points
    83
    Par défaut
    Citation Envoyé par methylene Voir le message
    Ok, je reviens vers ma première idée, que penserais-tu de déclarer ta GridView de cette façon là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Friend WithEvents GridViewTarifs As GridView = CType(e.Row.FindControl("TarifsView"), GridView)
    Qui incluerait les évènements.
    Merci beacoup pour ton aide.
    ça veut dire quoi "Friend" ? Enfin, je veux dire, pourquoi as-tu mis ce mot clé devant ?

    Cependant, quand je met ce code, Visual Studio me met cette erreur :

    'WithEvents' n'est pas valide dans une déclaration de variable locale

  10. #10
    Membre éclairé Avatar de methylene
    Profil pro
    Inscrit en
    Février 2010
    Messages
    659
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2010
    Messages : 659
    Points : 813
    Points
    813
    Par défaut
    Bon rapidement car je dois y aller:

    Au début de ta classe

    Tu déclares :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Friend WithEvents GridViewTarifs As GridView
    Ensuite dans ton sub tu remplace la ligne que je t'avais mis par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GridViewTarifs = New GridView
    Le seul petit soucis c'est que ca reste du Vb.net mais avec de l'asp (et ça je connais pas du tout), tout comme je résonne sur DataGridView.

    Je pense que ton pb initial était que tu déclarais ton gridview avec un Dim (ce qui il me semble n'inclut pas les évènements).

    De plus tu es obligé de déclarer un WithEvenets en dehors d'un sub, c'est pour cela en VB.net, moi je déclare hors des subs et j'instancie dans les sub.

    Bon week end.

  11. #11
    Membre régulier Avatar de Stephane_br
    Inscrit en
    Septembre 2005
    Messages
    222
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 222
    Points : 83
    Points
    83
    Par défaut
    Bonjour et merci pour ta réponse, j'ai déclaré mon second gridview en dehors de mon sub, en haut de mon code behind mais rien n'y fait. J'ai tjrs le même problème.

    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
    25
    Imports System
    Imports System.Data
    Imports System.IO
    Imports System.Configuration
    Imports System.Collections
    Imports System.Web
    Imports System.Web.Security
    Imports System.Web.UI
    Imports System.Web.UI.WebControls
    Imports System.Web.UI.WebControls.WebParts
    Imports System.Web.UI.HtmlControls
    Imports System.Data.OleDb
    Imports System.Data.SqlClient
    Imports Telerik.Web.UI
    
    
    Partial Class Liste_articles
        Inherits System.Web.UI.Page
    
        Friend WithEvents GridViewTarifs As GridView = New GridView    
    ...
    Public Sub .....()
    ...
    
    End class

  12. #12
    Membre régulier Avatar de Stephane_br
    Inscrit en
    Septembre 2005
    Messages
    222
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 222
    Points : 83
    Points
    83
    Par défaut
    Citation Envoyé par methylene Voir le message
    Bon rapidement car je dois y aller:

    Au début de ta classe

    Tu déclares :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Friend WithEvents GridViewTarifs As GridView
    Ensuite dans ton sub tu remplace la ligne que je t'avais mis par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GridViewTarifs = New GridView
    Le seul petit soucis c'est que ca reste du Vb.net mais avec de l'asp (et ça je connais pas du tout), tout comme je résonne sur DataGridView.

    Je pense que ton pb initial était que tu déclarais ton gridview avec un Dim (ce qui il me semble n'inclut pas les évènements).

    De plus tu es obligé de déclarer un WithEvenets en dehors d'un sub, c'est pour cela en VB.net, moi je déclare hors des subs et j'instancie dans les sub.

    Bon week end.


    Bonjour,

    Merci ton aide methylene, j'ai fini par trouver grâce à ta réponse.
    En gros, l'erreur venait de ma déclaration de la procédure Protected Sub TarifsView_RowDataBound lié à mon gridview imbriqué. En fait, dans la partie "handles", je passait le nom "TarifsView" qui correspondait à l'ID de mon gridview dans la page .aspx au lieu de passer le nom du gridview déclaré en haut de mon code behind tout bêtement dirais-je ....

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    Imports System
    Imports System.Data
    Imports System.IO
    Imports System.Configuration
    Imports System.Collections
    Imports System.Web
    Imports System.Web.Security
    Imports System.Web.UI
    Imports System.Web.UI.WebControls
    Imports System.Web.UI.WebControls.WebParts
    Imports System.Web.UI.HtmlControls
    Imports System.Data.OleDb
    Imports System.Data.SqlClient
    Imports Telerik.Web.UI
    
    
    Partial Class Liste_articles
        Inherits System.Web.UI.Page
    
        Friend WithEvents GridViewTarifs As GridView = New GridView
    
    ...
    
    Protected Sub TarifsView_RowDataBound(ByVal sender As Object,
     ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridViewTarifs.RowDataBound
      If e.Row.RowType = DataControlRowType.DataRow Then
              .....
      End if
    End Sub
    
    
    ...
    End Class

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 17/06/2014, 06h43
  2. [Débutant] Accès aux contrôles dans un User Control
    Par chouchouilloux dans le forum VB.NET
    Réponses: 4
    Dernier message: 08/10/2012, 22h09
  3. Réponses: 6
    Dernier message: 23/01/2007, 14h08
  4. Réponses: 3
    Dernier message: 09/06/2006, 15h41
  5. Acces aux attributs d'un bean dans une jsp
    Par mariemor64 dans le forum Struts 1
    Réponses: 2
    Dernier message: 02/06/2006, 10h32

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