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.
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 :
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.
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:
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
Partager