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 :

Création d'un ItempTemplate dynamiquement


Sujet :

ASP.NET

  1. #1
    Mvu
    Mvu est déconnecté
    Membre éclairé
    Inscrit en
    Septembre 2002
    Messages
    248
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 248
    Par défaut Création d'un ItempTemplate dynamiquement
    Toujours dans mon apprentissage à créer le contenu de mon Gridview dynamiquement...

    Je maîtrise le code pour les boundfield, hyperlinkfield etc...

    Maintenant je voudrais créer dynamiquement un TemplateField.

    Voici le code que je souhaite reproduire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <asp:TemplateField>
    <ItemTemplate>
    <asp:Image ID="Image1" runat="server" 
    ImageUrl='<%# Eval("id", "ShowPicture2.aspx?id={0}") %>' />
    </ItemTemplate>
    </asp:TemplateField>
    Comme je n'ai pas encore pigé toutes les subtilités du code je patauge dans ce qui suit: (le code bf est ok et précède)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    bf = New BoundField
                bf.HeaderText = getWibMsg(797, "Sort", pLang)
                bf.DataField = "id"
                bf.SortExpression = "id"
                Logos.Columns.Add(bf)
                bf.ItemStyle.Width = New Unit("140", UnitType.Pixel)
     
                tf = New TemplateField
                tf.ItemTemplate = ????
                ???
                Logos.Columns.Add(tf)
    Si qqn peut memettre sur la voie...

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

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Par défaut
    Zooffy a déjà rencontré le problème il me semble.
    Fais une recherche sur le fofo

  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
    rho, mon Lutecounet, t'aurais pu faire un copier coller du message que tu m'avais fait !

    T'inquiète Marc, super Zooffy arrive à la rescousse

    Va sur ce topic : http://www.developpez.net/forums/sho...d.php?t=591582

    C'est un peu plus large que ton problème, ça le couvre.

    Euh, aprés réflexion, désolé mon Lutecounet, tu n'aurais pas pu car le topic à été aspiré par la grande catastrohe du liquide de refroidissement. Mais permets moide saluer bien bas l'étendu de ta mémoire, tu es équipé en barrette Corsair ? Par contre, ça m'embête parce que les liens sympa que tu m'avais filer, ben ils sont perdus.

    Marc, potasse le topic et reviens vers moi si tu as des soucis, j'ai un peu de temps ces jours ci, voir je m'emmerde un peu, mais bon, faut pas le dire.
    Si ça t'embête pason fait toute la discussion ici, parce que je voudrais pas saturer ma boite de message. Les admins pourraient nous en rajouter un peu, non ?

    Et si quelqu'un trouve la solution à mon problème, je prends parce que là, je suis tout bloqué.

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

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052

  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
    Merci LuteceFalco, t'es vraiment un

    Mais alors, tu veux vraiment pas nous dire quelle est ta marque de barrette mémoire ?
    Ou t'es débordé et t'as pas le temps de déconner un poil ?

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

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Par défaut
    Citation Envoyé par zooffy Voir le message
    Merci LuteceFalco, t'es vraiment un

    Mais alors, tu veux vraiment pas nous dire quelle est ta marque de barrette mémoire ?
    Ou t'es débordé et t'as pas le temps de déconner un poil ?
    Mon cerveau marche à la Kriek
    Et oui je suis débordé en ce moment

  7. #7
    Mvu
    Mvu est déconnecté
    Membre éclairé
    Inscrit en
    Septembre 2002
    Messages
    248
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 248
    Par défaut
    La Kriek c'est pas terrible...si tu veux te doper bois de la Duvel !

  8. #8
    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
    Pas d'accord, la Kriek c'est trés bon, même je préfère la FARO.

    La Duvel, je la trouve un peu fade, mais il est vrai que ça ne ressemble pas aux bières fruitées précédement citée.

    Sinon, tu t'en sors avec mon morceau de code ?

  9. #9
    Mvu
    Mvu est déconnecté
    Membre éclairé
    Inscrit en
    Septembre 2002
    Messages
    248
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 248
    Par défaut
    Pas encore. Je vais bosser là dessus ce soir. Faut savoir que je suis lent, très très lent...
    A demain sans doute.

    PS: une bière que j'aime beaucoup c'est l'Orval brune. Tu peux en boire un paquet et t'auras pas mal à la tête.

  10. #10
    Mvu
    Mvu est déconnecté
    Membre éclairé
    Inscrit en
    Septembre 2002
    Messages
    248
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 248
    Par défaut
    On avance. Maintenant il faudrait m'expliquer comment imbriquer les deux codes ci-dessous.

    Code 1:
    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
        Private Class GridViewTemplate
            Implements ITemplate
            Dim templateType As ListItemType
            Dim columnName As String
    
            Sub New(ByVal type As ListItemType, ByVal ColName As String)
                templateType = type
                columnName = ColName
            End Sub
    
            Sub InstantiateIn(ByVal container As Control) _
               Implements ITemplate.InstantiateIn
                Dim lc As New Literal()
    
                Select Case templateType
                    Case ListItemType.Header
                        lc.Text = "<B>" & columnName & "</B>"
                        container.Controls.Add(lc)
    
                    Case ListItemType.Item
                        Dim bf As BoundField = Nothing
                        Dim im As New Image()
                        bf = New BoundField
                        bf.DataField = "id"
                        im.ID = "Image1"
                        im.ImageUrl = "~/DisplayPictures/ShowPicture2.aspx?id=2"
    
                        container.Controls.Add(lc)
    
                    Case ListItemType.EditItem
                        Dim tb As New TextBox()
                        tb.Text = ""
                        container.Controls.Add(tb)
                    Case ListItemType.Footer
                        lc.Text = "<I>Footer</I>"
                        container.Controls.Add(lc)
                End Select
            End Sub
        End Class
    Code 2:
    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
        Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
     
            Dim bf As BoundField = Nothing
            Dim hf As HyperLinkField = Nothing
            Dim tf As TemplateField = Nothing
     
            pLang = Request.QueryString("Lang")
     
            'on ne veut pas générer les colonnes automatiquement
            Logos.AutoGenerateColumns = False
            Logos.AllowPaging = True
            Logos.AllowSorting = True
     
     
            If Not Page.IsPostBack Then
     
                bf = New BoundField
                bf.HeaderText = getWibMsg(796, "Sort", pLang)
                bf.DataField = "idSupplier"
                bf.SortExpression = "idSupplier"
                Logos.Columns.Add(bf)
                bf.ItemStyle.Width = New Unit("140", UnitType.Pixel)
     
                bf = New BoundField
                bf.HeaderText = getWibMsg(797, "Sort", pLang)
                bf.DataField = "id"
                bf.SortExpression = "id"
                Logos.Columns.Add(bf)
                bf.ItemStyle.Width = New Unit("140", UnitType.Pixel)
     
            End If
     
        End Sub
    Actuellement, dans le code 1, la ligne en rouge renvoie une seule et même image pour chaque ligne de la table. Il s'agit de l'image ayant l'id=2.

    Comment faire maintenant pour qu'il récupère dynamiquement la valeur bf.DataField = "id" du code 2 pour qu'apparaisse pour chaque ligne l'image correspondante ?

    Je suppose qu'il faut tout réécrire?

  11. #11
    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
    Tu fais appel à deux concepts différent en même temps. J'ai fais aussi la même erreur.

    D'abords ce n'est pas dans la classe Template que du défini les chose dynamique. Si je comprends bien, selon ligne de donéne tu récupère une image différentes, donc ce n'ai qu'au moment du chargement du GridView que tu le sauras. Donc il faut placer du code dans l'évènement DataRowBound du GridView.

    Ensuite il faut récupérer l'Id de ligne de donnée. Disons qu'il y ales DAtaKeyx (que j'ai jamais réussi à faire fonctionner) et il y al bidouille, visiblement c'est cette méthode qu'on me conseille à chaque fois.

    Perso, je récupère les ID en les mettant dans une colonne en premier et je mets une classe CSS sur cette colonne pour al rendre "invisible" mais toujours présente.

    Voilà un bout qui me sert à récupérer l'ID de la ligne de donnée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CType(DataBinder.Eval(e.Row, "DataItem.Id"), String)
    ça fonctionne dans le cs d'un montage du GridView entièrement pas CodeBehind.

    Il faut aussi que tu pense à utiliser l'évènement DataBinding dans ta classe Tempalte. Et aussi que tu place des contrôle plus généraux, plutôt que des contrôle de GRidView. L'interêt du Template est justement d'utiliser des contrôle standard dans le GridView et donc de récupérer la souplesse des contrôle standard.

    Y vois tu plus clair ?

  12. #12
    Mvu
    Mvu est déconnecté
    Membre éclairé
    Inscrit en
    Septembre 2002
    Messages
    248
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 248
    Par défaut
    Là je suis largué !

    Je t'explique ma situation. D'abord je ne suis pas programmeur mais...menuisier de formation.. Ceci dit ce n'est pour cela qu'on a pas le droit de bidouiller des programmes.
    Je gère en Belgique un portail http://www.wood-it.be que j'ai entièrement écrit en ASP. Comme l'ASP a son avenir derrière lui, j'ai décidé de me mettre au .NET. J'apprécie beaucoup les outils GridView et autres pour leur facilité de mise en oeuvre et leur robustesse. Mais très vite je me suis rendu compte qu'ils ne sont pas souples. Un bête exemple: chez nous, tout doit être bilingue. Or les Gridview par exemple ne permettent pas d'afficher des en-tête de colonne par exemple en fonction de la langue du visiteur. La solution étant alors d'écrire tout le machin en codebehind.

    J'en suis arrivé là sans trop de difficulté.
    Par contre, maintenant que je veux attaquer les TemplateFields, c'est une autre paire de manches.

    Si tu as desconseils..

  13. #13
    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
    Bon, je comprends mieux et je me dis que "ça va pas être simple".

    Si tu n'a pas de connaissance en programmation orientée objet, on va partir de trés loin. Mais aprés tout, ce forum est bien un forum d'entraide, donc ceux qui savent aident ceux qui savent pas, comme ça on sera plus nombreux à savoir et donc on sera plus fort.

    Revenons sur notre souci de TemplateField. L'idée est de bien comprendre les type de contrôle que l'on peut utiliser dans un GridView. On va aprtir du principe que tu sais bien monter un GridView en CodeBehind.
    Donc tu as vu comment ajouter un BoundField ou un ImageField. Le templatefiled c'est presque pareil, sauf que lui, il faut le définir. Prenons le Bound Filed, tu lui envoi une String qui vient directement de al base de données. Mais ce contrôle est "figé". A part lui envoyé une String, tu fais pas grand chose d'autre.

    Si ton besoins devient particulier, genre envoyer une image spéciale, ben faut passer par un TemplateField. Mais il faut savoir que le TemplateField sert à faire des choses particulières, par exemple envoyer une contrôle composite qui serait composé de deux textbox et d'un bouton, le tout lié par du code.

    Mais en rédigenat ces lignes je réfléchis àton souci d'iamge. Ce que tu veux, c'est envoyer une image particulière en fonction d'une donnée ? As tu pensé à mettre un ImageField avec une UrlFormatString ?

    ça donne une truc dans ce genre (à condition d'avoir un champ de donnée qui contient ce qu'il faut)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Dim img As New ImageField
    With img
    	.DataImageUrlField = "mon champ de donnée"
    	.DataImageUrlFormatString = "debut du chemin/{0}fin du chemin, extention"
    End With
    le {0} va prendre la valeur contenue dans le champ, à toi de voir ensuite le genre de donnée que tu stocke ou que tu renvoi à partir de ta requête source.

    Alors plusieurs questions :
    - comprends tu tous les termes exposés dans mon texte ? N'hésites pas à me dire si je suis aller trop vite ou trop loin. Je serais ravi de partager mon maigre savoir avec toi.
    - selon l'idée de l'ImageField as tu toujours besoins de faire un TemplateFiled ?
    - veux tu quand même (dans le csa d'une réponse non à la précédente question) qu'on potasse les TemplateField?

    Voilà, moi j'aime beaucoup les autodidacte qu'on pas peur. Moi même autodidacte, je ne peux que respecter. Mais bon, moi je suis tombé dedans j'avais 11 ans, donc ça fait...... euh, vachement longtemps vu que j'en ai 38. Et j'ai fait deux formations professionnelles en plus.

  14. #14
    Mvu
    Mvu est déconnecté
    Membre éclairé
    Inscrit en
    Septembre 2002
    Messages
    248
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 248
    Par défaut
    Cela fait du bien devoir qu'on peut faire appel à l'équipe...Tu as bien compris que je suis autodidacte (je trouve d'ailleurs que c'est la plus belle façon d'apprendre) mais il faut payer le prix (temps...).

    Comme ligne de conduite pour mon apprentissage du .Net, je me suis fixé comme l'objectif de reproduire tous les cas de figure que j'ai rencontré sur mon portail. L'avantage:c'est du concret et c'est ce dont j'ai besoin pour déveloper dans le futur.

    Concernant l'ImageField, oui, j'ai un fichier qui marche bien. Mais il faut savoir que toutes les images du portail sont sauvegardées en binaire dans la DB. Et pour reproduire ces images "binaires" dans un GridView, il faut passer par le TemplateField. C'est le point où je suis arrivé.

    Maintenant, imaginons (comme c'est le cas sur le portail), que je veuille appliquer à l'image un hyperlien (genre <a href="">) qui se trouve dans une colonne de la DB. Je n'ai pas d'autre choix que d'écrire du codebehind pour cela.

    Donc pour répondre à ta question oui je suis preneur pour le TemplateField.

  15. #15
    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
    Pour l'image avec un lien, oui le mieux est de passé par un TemplateField.

    Donc, reprenons le principe du TemplateField, de manière un peu empirique.

    D'abords il faut voir l'initialisation du machin.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Dim apercu As New TemplateField
    With apercu
    	.ItemTemplate = New TemplatePopup(DataControlRowType.DataRow, "Id_Campagne", "Apercu")
    	.HeaderTemplate = New TemplatePopup(DataControlRowType.Header, "Aperçu", "Apercu")
    End With
    Là, je vais monter une colonne dans mon GridView qui contient une image cliquable.

    Le TemplateField fonctionne avec un classe d'objet fabriquée sur mesuer. Pour plus d'info suivre le lien de LuteceFalco.
    Donc, cela veux dire qu'il va falloir faire du code qui va décrire comment on fabrique le contrôle que l'on vuet mettre dans la colonne du GridView.
    Dans mon cas je fais ç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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    Public Class TemplatePopup
    	Implements ITemplate
     
    	Private templateType As DataControlRowType
    	Private columnName As String 'le nom de la colonne de la source de données
    	Private controleName As String 'le nom du contrôle à mettre dans la colonne
     
    	Sub New(ByVal type As DataControlRowType, ByVal colname As String, ByVal ctrlName As String)
    		templateType = type
    		columnName = colname
    		controleName = ctrlName
    	End Sub
     
    	Sub InstantiateIn(ByVal container As System.Web.UI.Control) _
    	 Implements ITemplate.InstantiateIn
     
    		Select Case templateType
    			Case DataControlRowType.Header
    				Dim lc As New Literal
    				lc.Text = "<b>" & columnName & "</b>"
    				container.Controls.Add(lc)
     
    			Case DataControlRowType.DataRow
    				Select Case controleName
    					Case "Apercu"
    						Dim hl As New HyperLink
    						AddHandler hl.DataBinding, AddressOf hl_DataBinding
    						container.Controls.Add(hl)
    					Case "Actif"
    						Dim ib As New LinkButton
    						AddHandler ib.DataBinding, AddressOf ib_DataBinding
    						container.Controls.Add(ib)
    					Case Else
     
    				End Select
     
    			Case Else
    				' Insert code to handle unexpected values. 
    		End Select
    	End Sub
     
    	Private Sub hl_DataBinding(ByVal sender As Object, ByVal e As EventArgs)
    		Dim l As HyperLink = CType(sender, HyperLink)
    		Dim row As GridViewRow = CType(l.NamingContainer, GridViewRow)
    		l.Text = DataBinder.Eval(row.DataItem, "Id_Campagne").ToString()
    		l.ID = "hlCamp" & DataBinder.Eval(row.DataItem, "Id_Campagne").ToString()
    	End Sub
     
    	Private Sub ib_DataBinding(ByVal sender As Object, ByVal e As EventArgs)
    		Dim l As LinkButton = CType(sender, LinkButton)
    		Dim row As GridViewRow = CType(l.NamingContainer, GridViewRow)
    		l.ID = "ibActif" & DataBinder.Eval(row.DataItem, "Id_Campagne").ToString()
    		l.Enabled = True
    		l.CommandName = "chgActif"
    	End Sub
    End Class
    Tu suis le code avec le Case Aperçu. Tu note qu'on luyi envoi des paramettre et qu'on est assez libre, faut juste mettre au moins les deux premiers : templateType et columnName. Moi j'ai rajouté controleName pour me retrouver un ID qui sert plus tard.

    Ensuite tu note qu'on utilise l'évènement DAtaBinding, qui va réagir au "chargement" du contrôle dans le GridView, c'est à dire à chaque fois que le GridView va lire une ligne de la source de données. Et c'est là qu'on peut ajouter des chose un peut dynamique, tel qu'un identifiant unique.

    Tu note aussi que l'objet row permet de faire une lien avec la Ligne de donnée en cours de lecture et donc de ratraper tous les champs présents dans cette ligne.

    Ensuite on va revenir dans le code de la page elle même et mettre en oeuvre l'évènement DataRowBound du GridView. Là on chargera définitvement le contrôle avec tous les détail qu'on veut lui rajouter dynamiquement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Protected Sub gvCampagne_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles gvCampagne.RowDataBound
    		If e.Row.RowType = DataControlRowType.DataRow Then
    			If e.Row.RowType = DataControlRowType.DataRow Then
    				Dim lnk As HyperLink = CType(e.Row.FindControl("hlCamp" & CType(DataBinder.Eval(e.Row, "DataItem.Id_Campagne"), String)), HyperLink)
    				With lnk
    					.NavigateUrl = String.Format("JavaScript:test(' ceci vient du code : {0}');", CType(DataBinder.Eval(e.Row, "DataItem.Id_Campagne"), String))
    					.ImageUrl = "~/App_Themes/" & GetNomsite() & "/lettresinfo.png"
    				End With
    			End If
    		End If
    	End Sub
    Mon problème était de pouvoir lui envoyer l'identifaint de la ligne dans un URL Jscript pour ouvrir une popup. Mon iamge elle reste la même en fonction du thème choisi.
    Toi, vu que tu veux une image différente selon les ligne, tu agira plutôt sur le .ImageUrl en lui passant soit la valeur contenue dans ton champ Image (je ne sais pas trop comment ça marche), soit le lien vers ta page qui décrypte les images, comme j'ai pu voir dans ton code plus haut.

    Tu aura remarqué que l'on prend un contrôle HyperLink et une contrôle Image, qui sont des contrôles standard de .NET pour des pages classique.
    Grâce à ces contrôles que l'on va imbriquer dans le code de la Class TemapltePopup, on obtient un contrôle composite que l'on place comme une colone dans le GridView avec le classique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    GridView.Control.Add(apercu)
    Est ce que c'est plus clair ?

    Pour affiner, je te propose que tu cite mon mesage, tu élimine ce que tu as compris et place tes commentaires juste en dessous de ce qui te reste obscur.

    Kenavo

  16. #16
    Mvu
    Mvu est déconnecté
    Membre éclairé
    Inscrit en
    Septembre 2002
    Messages
    248
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 248
    Par défaut
    Citation Envoyé par zooffy Voir le message
    Pour l'image avec un lien, oui le mieux est de passé par un TemplateField.

    Donc, reprenons le principe du TemplateField, de manière un peu empirique.

    D'abords il faut voir l'initialisation du machin.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Dim apercu As New TemplateField
    With apercu
    	.ItemTemplate = New TemplatePopup(DataControlRowType.DataRow, "Id_Campagne", "Apercu")
    	.HeaderTemplate = New TemplatePopup(DataControlRowType.Header, "Aperçu", "Apercu")
    End With
    Là, je vais monter une colonne dans mon GridView qui contient une image cliquable.

    Le TemplateField fonctionne avec un classe d'objet fabriquée sur mesuer. Pour plus d'info suivre le lien de LuteceFalco.
    Donc, cela veux dire qu'il va falloir faire du code qui va décrire comment on fabrique le contrôle que l'on vuet mettre dans la colonne du GridView.
    Dans mon cas je fais ç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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    Public Class TemplatePopup
    	Implements ITemplate
     
    	Private templateType As DataControlRowType
    	Private columnName As String 'le nom de la colonne de la source de données
    	Private controleName As String 'le nom du contrôle à mettre dans la colonne
     
    	Sub New(ByVal type As DataControlRowType, ByVal colname As String, ByVal ctrlName As String)
    		templateType = type
    		columnName = colname
    		controleName = ctrlName
    	End Sub
     
    	Sub InstantiateIn(ByVal container As System.Web.UI.Control) _
    	 Implements ITemplate.InstantiateIn
     
    		Select Case templateType
    			Case DataControlRowType.Header
    				Dim lc As New Literal
    				lc.Text = "<b>" & columnName & "</b>"
    				container.Controls.Add(lc)
     
    			Case DataControlRowType.DataRow
    				Select Case controleName
    					Case "Apercu"
    						Dim hl As New HyperLink
    						AddHandler hl.DataBinding, AddressOf hl_DataBinding
    						container.Controls.Add(hl)
    					Case "Actif"
    						Dim ib As New LinkButton
    						AddHandler ib.DataBinding, AddressOf ib_DataBinding
    						container.Controls.Add(ib)
    					Case Else
     
    				End Select
     
    			Case Else
    				' Insert code to handle unexpected values. 
    		End Select
    	End Sub
     
    	Private Sub hl_DataBinding(ByVal sender As Object, ByVal e As EventArgs)
    		Dim l As HyperLink = CType(sender, HyperLink)
    		Dim row As GridViewRow = CType(l.NamingContainer, GridViewRow)
    		l.Text = DataBinder.Eval(row.DataItem, "Id_Campagne").ToString()
    		l.ID = "hlCamp" & DataBinder.Eval(row.DataItem, "Id_Campagne").ToString()
    	End Sub
     
    	Private Sub ib_DataBinding(ByVal sender As Object, ByVal e As EventArgs)
    		Dim l As LinkButton = CType(sender, LinkButton)
    		Dim row As GridViewRow = CType(l.NamingContainer, GridViewRow)
    		l.ID = "ibActif" & DataBinder.Eval(row.DataItem, "Id_Campagne").ToString()
    		l.Enabled = True
    		l.CommandName = "chgActif"
    	End Sub
    End Class
    Tu suis le code avec le Case Aperçu. Tu note qu'on luyi envoi des paramettre et qu'on est assez libre, faut juste mettre au moins les deux premiers : templateType et columnName. Moi j'ai rajouté controleName pour me retrouver un ID qui sert plus tard.

    Ensuite tu note qu'on utilise l'évènement DAtaBinding, qui va réagir au "chargement" du contrôle dans le GridView, c'est à dire à chaque fois que le GridView va lire une ligne de la source de données. Et c'est là qu'on peut ajouter des chose un peut dynamique, tel qu'un identifiant unique.

    Tu note aussi que l'objet row permet de faire une lien avec la Ligne de donnée en cours de lecture et donc de ratraper tous les champs présents dans cette ligne.

    Ensuite on va revenir dans le code de la page elle même et mettre en oeuvre l'évènement DataRowBound du GridView. Là on chargera définitvement le contrôle avec tous les détail qu'on veut lui rajouter dynamiquement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Protected Sub gvCampagne_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles gvCampagne.RowDataBound
    		If e.Row.RowType = DataControlRowType.DataRow Then
    			If e.Row.RowType = DataControlRowType.DataRow Then
    				Dim lnk As HyperLink = CType(e.Row.FindControl("hlCamp" & CType(DataBinder.Eval(e.Row, "DataItem.Id_Campagne"), String)), HyperLink)
    				With lnk
    Je ne comprends pas la ligne qui suit:
    					.NavigateUrl = String.Format("JavaScript:test(' ceci vient du code : {0}');", CType(DataBinder.Eval(e.Row, "DataItem.Id_Campagne"), String))
    					.ImageUrl = "~/App_Themes/" & GetNomsite() & "/lettresinfo.png"
    				End With
    			End If
    		End If
    	End Sub
    Mon problème était de pouvoir lui envoyer l'identifaint de la ligne dans un URL Jscript pour ouvrir une popup. Mon iamge elle reste la même en fonction du thème choisi.
    Toi, vu que tu veux une image différente selon les ligne, tu agira plutôt sur le .ImageUrl en lui passant soit la valeur contenue dans ton champ Image (je ne sais pas trop comment ça marche), soit le lien vers ta page qui décrypte les images, comme j'ai pu voir dans ton code plus haut.

    Tu aura remarqué que l'on prend un contrôle HyperLink et une contrôle Image, qui sont des contrôles standard de .NET pour des pages classique.
    Grâce à ces contrôles que l'on va imbriquer dans le code de la Class TemapltePopup, on obtient un contrôle composite que l'on place comme une colone dans le GridView avec le classique :
    Je pige pasoù je dois mettre le code qui suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    GridView.Control.Add(apercu)
    Est ce que c'est plus clair ?

    Pour affiner, je te propose que tu cite mon mesage, tu élimine ce que tu as compris et place tes commentaires juste en dessous de ce qui te reste obscur.

    Kenavo

  17. #17
    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
    Citation Envoyé par Mvu Voir le message
    With lnk
    Je ne comprends pas la ligne qui suit:
    .NavigateUrl = String.Format("javascript:test(' ceci vient du code : {0}');", CType(DataBinder.Eval(e.Row, "DataItem.Id_Campagne"), String))
    .ImageUrl = "~/App_Themes/" & GetNomsite() & "/lettresinfo.png"
    End With
    Ce code est le lien que tu veux que le bouton suive lorsque ton visiteur clique dessus.
    Dans mon cas c'est un poil compliqué car mon lien active une fonction Jscript.
    Toi tu metra plutôt un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    .NavigateUrl = "~/mon répertoire/mapge.aspx"
    avec éventuellement une querystring

    Citation Envoyé par Mvu Voir le message
    Je pige pasoù je dois mettre le code qui suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GridView.Control.Add(apercu)
    Ce code, tu le mets dans ta page de CodeBehind, à la suite de tes intégrations de colonne de GridView. apercu devient une colonne comme une autre.

  18. #18
    Mvu
    Mvu est déconnecté
    Membre éclairé
    Inscrit en
    Septembre 2002
    Messages
    248
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 248
    Par défaut
    Citation Envoyé par zooffy Voir le message
    Ce code est le lien que tu veux que le bouton suive lorsque ton visiteur clique dessus.
    Dans mon cas c'est un poil compliqué car mon lien active une fonction Jscript.
    Toi tu metra plutôt un truc du genre :
    OK j'a écrit .NavigateUrl = "~/DisplayPictures/Default.aspx" mais il n'aime pas. Message: La référence d'objet n'est pas définie à une instance d'un objet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    .NavigateUrl = "~/mon répertoire/mapge.aspx"
    avec éventuellement une querystring


    Ce code, tu le mets dans ta page de CodeBehind, à la suite de tes intégrations de colonne de GridView. apercu devient une colonne comme une autre.

  19. #19
    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
    Et il bloque bien sur cette ligne là ?

    Parce que ce genre de message c'est qu'il n'a pas trouvé l'objet qu'il cherche, soit parce que l'objet n'est pas encore reconstruit, soit parce qu'il est tout simplement absent.

    Pourrais tu me poster la pile qui se trouve plus bas que le message, dans un cadre à fond jaune.

    Par contre, je crains fort de ne pouvoir te répondre que Lunid, je quitte mon job à 17 H 00

  20. #20
    Mvu
    Mvu est déconnecté
    Membre éclairé
    Inscrit en
    Septembre 2002
    Messages
    248
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 248
    Par défaut
    Trace de la pile:


    [NullReferenceException: La référence d'objet n'est pas définie à une instance d'un objet.]
    DisplayPictures_Zooffy.Logos_RowDataBound(Object sender, GridViewRowEventArgs e) in C:\Documents and Settings\Mvu\Mes documents\Visual Studio 2008\WebSites\Wib2008v2\DisplayPictures\Zooffy.aspx.vb:96
    System.Web.UI.WebControls.GridView.OnRowDataBound(GridViewRowEventArgs e) +105
    System.Web.UI.WebControls.GridView.CreateRow(Int32 rowIndex, Int32 dataSourceIndex, DataControlRowType rowType, DataControlRowState rowState, Boolean dataBind, Object dataItem, DataControlField[] fields, TableRowCollection rows, PagedDataSource pagedDataSource) +233
    System.Web.UI.WebControls.GridView.CreateChildControls(IEnumerable dataSource, Boolean dataBinding) +2957
    System.Web.UI.WebControls.CompositeDataBoundControl.PerformDataBinding(IEnumerable data) +59
    System.Web.UI.WebControls.GridView.PerformDataBinding(IEnumerable data) +11
    System.Web.UI.WebControls.DataBoundControl.OnDataSourceViewSelectCallback(IEnumerable data) +111
    System.Web.UI.DataSourceView.Select(DataSourceSelectArguments arguments, DataSourceViewSelectCallback callback) +29
    System.Web.UI.WebControls.DataBoundControl.PerformSelect() +149
    System.Web.UI.WebControls.BaseDataBoundControl.DataBind() +70
    System.Web.UI.WebControls.GridView.DataBind() +4
    System.Web.UI.WebControls.BaseDataBoundControl.EnsureDataBound() +82
    System.Web.UI.WebControls.CompositeDataBoundControl.CreateChildControls() +69
    System.Web.UI.Control.EnsureChildControls() +87
    System.Web.UI.Control.PreRenderRecursiveInternal() +50
    System.Web.UI.Control.PreRenderRecursiveInternal() +170
    System.Web.UI.Control.PreRenderRecursiveInternal() +170
    System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +2041

Discussions similaires

  1. Création d'un tableau dynamique avec XSL-FO
    Par lionelbrizuela dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 31/01/2006, 11h04
  2. Réponses: 10
    Dernier message: 31/12/2005, 20h10
  3. Création d'un ensemble "dynamique"
    Par petitcoucou31 dans le forum Langage
    Réponses: 3
    Dernier message: 29/12/2004, 18h05
  4. création d'une librairie dynamique
    Par bilo2000 dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 26/08/2004, 15h17
  5. [Plugin] Création d'une vue dynamiquement
    Par The Bonze dans le forum Eclipse Platform
    Réponses: 2
    Dernier message: 15/06/2004, 13h23

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