Mise en forme des contrôles DataList et Repeater en fonction des données (VB)
par Scott Mitchell
Dans ce tutoriel, nous allons parcourir des exemples de mise en forme de l’apparence des contrôles DataList et Repeater, soit en utilisant des fonctions de mise en forme dans des modèles, soit en gérant l’événement DataBound.
Introduction
Comme nous l’avons vu dans le tutoriel précédent, datalist offre un certain nombre de propriétés liées au style qui affectent son apparence. En particulier, nous avons vu comment affecter des classes CSS par défaut aux propriétés DataList s HeaderStyle
, ItemStyle
, AlternatingItemStyle
, et SelectedItemStyle
. En plus de ces quatre propriétés, le DataList inclut un certain nombre d’autres propriétés liées au style, telles que , ForeColor
, BackColor
et BorderWidth
, pour n’en nommer que Font
quelques-unes. Le contrôle Repeater ne contient aucune propriété liée au style. Ces paramètres de style doivent être effectués directement dans le balisage dans les modèles s du répéteur.
Souvent, cependant, la façon dont les données doivent être mises en forme dépend des données elles-mêmes. Par exemple, lors de la liste des produits, nous pouvons afficher les informations sur le produit dans une couleur de police gris clair si elles sont supprimées, ou nous pouvons mettre en surbrillance la UnitsInStock
valeur si elle est égale à zéro. Comme nous l’avons vu dans les tutoriels précédents, GridView, DetailsView et FormView offrent deux façons distinctes de mettre en forme leur apparence en fonction de leurs données :
- L’événement
DataBound
crée un gestionnaire d’événements pour l’événement appropriéDataBound
, qui se déclenche une fois que les données ont été liées à chaque élément (pour gridView, c’était l’événementRowDataBound
; pour datalist et repeater, il s’agit de l’événementItemDataBound
). Dans ce gestionnaire d’événements, les données simplement liées peuvent être examinées et les décisions de mise en forme prises. Nous avons examiné cette technique dans le didacticiel Mise en forme personnalisée basée sur les données . - Les fonctions de mise en forme dans les modèles lors de l’utilisation de TemplateFields dans les contrôles DetailsView ou GridView, ou d’un modèle dans le contrôle FormView, nous pouvons ajouter une fonction de mise en forme à la classe code-behind de la page ASP.NET, à la couche logique métier ou à toute autre bibliothèque de classes accessible à partir de l’application web. Cette fonction de mise en forme peut accepter un nombre arbitraire de paramètres d’entrée, mais doit retourner le code HTML à afficher dans le modèle. Les fonctions de mise en forme ont d’abord été examinées dans le tutoriel Utilisation de TemplateFields dans le contrôle GridView .
Ces deux techniques de mise en forme sont disponibles avec les contrôles DataList et Repeater. Dans ce tutoriel, nous allons parcourir des exemples utilisant les deux techniques pour les deux contrôles.
Utilisation du gestionnaire d’événementsItemDataBound
Lorsque les données sont liées à une dataList, soit à partir d’un contrôle de source de données, soit via l’affectation programmatique de données à la propriété s du DataSource
contrôle et l’appel de sa DataBind()
méthode, l’événement DataList s se déclenche, la source de DataBinding
données énumérée et chaque enregistrement de données est lié à la DataList. Pour chaque enregistrement de la source de données, datalist crée un DataListItem
objet qui est ensuite lié à l’enregistrement actif. Au cours de ce processus, datalist déclenche deux événements :
ItemCreated
se déclenche une fois que leDataListItem
a été crééItemDataBound
se déclenche une fois que l’enregistrement actif a été lié auDataListItem
Les étapes suivantes décrivent le processus de liaison de données pour le contrôle DataList.
L’événement DataList se
DataBinding
déclencheLes données sont liées à la liste de données
Pour chaque enregistrement dans la source de données
- Créer un
DataListItem
objet - Déclencher l’événement
ItemCreated
- Lier l’enregistrement au
DataListItem
- Déclencher l’événement
ItemDataBound
- Ajouter à
DataListItem
laItems
collection
- Créer un
Lors de la liaison de données au contrôle Repeater, elles progressent dans la même séquence d’étapes. La seule différence est qu’au lieu de créer des DataListItem
instances, le répéteur utilise RepeaterItem
s.
Notes
Le lecteur astute a peut-être remarqué une légère anomalie entre la séquence d’étapes qui se produit lorsque le DataList et le Repeater sont liés à des données et lorsque gridView est lié à des données. À l’extrémité du processus de liaison de données, GridView déclenche l’événement DataBound
; toutefois, ni le contrôle DataList ni Repeater n’ont un tel événement. Cela est dû au fait que les contrôles DataList et Repeater ont été créés dans la période ASP.NET 1.x, avant que le modèle de gestionnaire d’événements de pré et de post-niveau ne soit devenu courant.
Comme avec GridView, une option de mise en forme basée sur les données consiste à créer un gestionnaire d’événements pour l’événement ItemDataBound
. Ce gestionnaire d’événements inspecte les données qui viennent d’être liées au DataListItem
ou RepeaterItem
et affecte la mise en forme du contrôle si nécessaire.
Pour le contrôle DataList, les modifications de mise en forme de l’élément entier peuvent être implémentées à l’aide DataListItem
des propriétés liées au style s, qui incluent la norme Font
, ForeColor
, BackColor
, CssClass
, et ainsi de suite. Pour affecter la mise en forme de contrôles Web particuliers dans le modèle DataList s, nous devons accéder par programmation et modifier le style de ces contrôles Web. Nous avons vu comment effectuer cette opération dans le didacticiel Mise en forme personnalisée basée sur les données . Comme le contrôle Repeater, la RepeaterItem
classe n’a pas de propriétés liées au style ; par conséquent, toutes les modifications liées au style apportées à un dans le ItemDataBound
gestionnaire d’événements RepeaterItem
doivent être effectuées en accédant par programmation aux contrôles Web dans le modèle et en les mettant à jour.
Étant donné que la ItemDataBound
technique de mise en forme de DataList et de Repeater est pratiquement identique, notre exemple se concentre sur l’utilisation de la DataList.
Étape 1 : affichage des informations sur le produit dans la liste de données
Avant de nous soucier de la mise en forme, créons d’abord une page qui utilise une DataList pour afficher des informations sur le produit. Dans le tutoriel précédent , nous avons créé une DataList qui ItemTemplate
affichait le nom, la catégorie, le fournisseur, la quantité par unité et le prix de chaque produit. Répétons cette fonctionnalité ici dans ce tutoriel. Pour ce faire, vous pouvez recréer le DataList et son ObjectDataSource à partir de zéro, ou vous pouvez copier ces contrôles à partir de la page créée dans le tutoriel précédent (Basics.aspx
) et les coller dans la page de ce didacticiel (Formatting.aspx
).
Une fois que vous avez répliqué les fonctionnalités DataList et ObjectDataSource à partir de Basics.aspx
Formatting.aspx
, prenez un moment pour passer de la propriété DataList s ID
à une propriété DataList1
plus descriptive ItemDataBoundFormattingExample
. Ensuite, affichez dataList dans un navigateur. Comme le montre la figure 1, la seule différence de mise en forme entre chaque produit est que la couleur d’arrière-plan alterne.
Figure 1 : Les produits sont répertoriés dans le contrôle DataList (cliquez pour afficher l’image en taille réelle)
Pour ce tutoriel, nous allons mettre en forme la DataList de telle sorte que tous les produits dont le prix est inférieur à 20,00 $ aient leur nom et leur prix unitaire mis en évidence en jaune.
Étape 2 : Détermination par programmation de la valeur des données dans le gestionnaire d’événements ItemDataBound
Étant donné que seuls les produits dont le prix est inférieur à 20,00 $ auront la mise en forme personnalisée appliquée, nous devons être en mesure de déterminer le prix de chaque produit. Lors de la liaison de données à une dataList, dataList énumère les enregistrements dans sa source de données et, pour chaque enregistrement, crée un DataListItem
instance, liant l’enregistrement de source de données à .DataListItem
Une fois que les données de l’enregistrement particulier ont été liées à l’objet actif DataListItem
, l’événement DataList s est ItemDataBound
déclenché. Nous pouvons créer un gestionnaire d’événements pour cet événement afin d’inspecter les valeurs de données actuelles DataListItem
et, en fonction de ces valeurs, d’apporter les modifications de mise en forme nécessaires.
Créez un ItemDataBound
événement pour datalist et ajoutez le code suivant :
Protected Sub ItemDataBoundFormattingExample_ItemDataBound _
(sender As Object, e As DataListItemEventArgs) _
Handles ItemDataBoundFormattingExample.ItemDataBound
If e.Item.ItemType = ListItemType.Item OrElse _
e.Item.ItemType = ListItemType.AlternatingItem Then
' Programmatically reference the ProductsRow instance
' bound to this DataListItem
Dim product As Northwind.ProductsRow = _
CType(CType(e.Item.DataItem, System.Data.DataRowView).Row, _
Northwind.ProductsRow)
' See if the UnitPrice is not NULL and less than $20.00
If Not product.IsUnitPriceNull() AndAlso product.UnitPrice < 20 Then
' TODO: Highlight the product's name and price
End If
End If
End Sub
Bien que le concept et la sémantique derrière le gestionnaire d’événements DataList soient ItemDataBound
les mêmes que ceux utilisés par le gestionnaire d’événements GridView dans RowDataBound
le didacticiel Mise en forme personnalisée basée sur les données , la syntaxe diffère légèrement. Lorsque l’événement ItemDataBound
se déclenche, le DataListItem
juste lié aux données est passé dans le gestionnaire d’événements correspondant via e.Item
(au lieu de , comme avec le gestionnaire d’événements e.Row
RowDataBound
GridView). Le gestionnaire d’événements DataList s’active ItemDataBound
pour chaque ligne ajoutée à la DataList, y compris les lignes d’en-tête, les lignes de pied de page et les lignes de séparateur. Toutefois, les informations sur le produit sont uniquement liées aux lignes de données. Par conséquent, lorsque vous utilisez l’événement ItemDataBound
pour inspecter les données liées à dataList, nous devons d’abord nous assurer que nous travaillons avec un élément de données. Pour ce faire, vérifiez la DataListItem
propriété sItemType
, qui peut avoir l’une des huit valeurs suivantes :
AlternatingItem
EditItem
Footer
Header
Item
Pager
SelectedItem
Separator
Les éléments de données datalist et AlternatingItem``DataListItem
les s sont à la foisItem
. En supposant que nous travaillons avec un Item
ou , nous accédons à la instance réelle ProductsRow
qui était liée au actuel DataListItem
AlternatingItem
. La DataListItem
propriété s DataItem
contient une référence à l’objet, dont Row
la DataRowView
propriété fournit une référence à l’objet réelProductsRow
.
Ensuite, nous case activée la ProductsRow
propriété s du UnitPrice
instance. Étant donné que le champ s de la table Produits UnitPrice
autorise NULL
les valeurs, avant d’essayer d’accéder à la UnitPrice
propriété, nous devons d’abord case activée pour voir s’il a une NULL
valeur à l’aide de la IsUnitPriceNull()
méthode . Si la UnitPrice
valeur n’est pas NULL
, nous case activée pour voir si elle est inférieure à 20,00 $. S’il est effectivement inférieur à 20,00 $, nous devons appliquer la mise en forme personnalisée.
Étape 3 : Mise en surbrillance du nom et du prix du produit
Une fois que nous savons que le prix d’un produit est inférieur à 20,00 $, il ne reste plus qu’à mettre en évidence son nom et son prix. Pour ce faire, nous devons d’abord référencer par programmation les contrôles Label dans le ItemTemplate
qui affichent le nom et le prix du produit. Ensuite, nous devons leur faire afficher un arrière-plan jaune. Ces informations de mise en forme peuvent être appliquées en modifiant directement les propriétés Des étiquettes BackColor
(LabelID.BackColor = Color.Yellow
; dans l’idéal, cependant, toutes les questions liées à l’affichage doivent être exprimées par le biais de feuilles de style en cascade. En fait, nous avons déjà une feuille de style qui fournit la mise en forme souhaitée définie dans Styles.css
- AffordablePriceEmphasis
, qui a été créée et abordée dans le tutoriel Mise en forme personnalisée basée sur les données .
Pour appliquer la mise en forme, définissez simplement les deux propriétés des contrôles CssClass
Label Web sur AffordablePriceEmphasis
, comme indiqué dans le code suivant :
' Highlight the product name and unit price Labels
' First, get a reference to the two Label Web controls
Dim ProductNameLabel As Label = CType(e.Item.FindControl("ProductNameLabel"), Label)
Dim UnitPriceLabel As Label = CType(e.Item.FindControl("UnitPriceLabel"), Label)
' Next, set their CssClass properties
If ProductNameLabel IsNot Nothing Then
ProductNameLabel.CssClass = "AffordablePriceEmphasis"
End If
If UnitPriceLabel IsNot Nothing Then
UnitPriceLabel.CssClass = "AffordablePriceEmphasis"
End If
Une fois le ItemDataBound
gestionnaire d’événements terminé, revenez à la Formatting.aspx
page dans un navigateur. Comme l’illustre la figure 2, les produits dont le prix est inférieur à 20,00 $ mettent en évidence leur nom et leur prix.
Figure 2 : Les produits inférieurs à 20,00 $ sont mis en surbrillance (cliquer pour afficher l’image en taille réelle)
Notes
Étant donné que dataList est rendu en tant que code HTML <table>
, ses DataListItem
instances ont des propriétés liées au style qui peuvent être définies pour appliquer un style spécifique à l’élément entier. Par exemple, si nous voulions mettre en surbrillance l’ensemble de l’élément jaune lorsque son prix était inférieur à 20,00 $, nous aurions pu remplacer le code qui faisait référence aux Étiquettes et définir leurs CssClass
propriétés par la ligne de code suivante : e.Item.CssClass = "AffordablePriceEmphasis"
(voir figure 3).
Toutefois RepeaterItem
, les s qui composent le contrôle Repeater n’offrent pas de telles propriétés de niveau de style. Par conséquent, l’application d’une mise en forme personnalisée au répéteur nécessite l’application de propriétés de style aux contrôles Web dans les modèles s du répéteur, comme nous l’avons fait dans la figure 2.
Figure 3 : L’élément de produit entier est mis en surbrillance pour les produits de moins de 20,00 $ (Cliquer pour afficher l’image en taille réelle)
Utilisation des fonctions de mise en forme à partir du modèle
Dans le tutoriel Utilisation de TemplateFields dans le contrôle GridView , nous avons vu comment utiliser une fonction de mise en forme dans un GridView TemplateField pour appliquer une mise en forme personnalisée en fonction des données liées aux lignes gridView. Une fonction de mise en forme est une méthode qui peut être appelée à partir d’un modèle et retourne le code HTML à émettre à sa place. Les fonctions de mise en forme peuvent résider dans la classe code-behind de la page ASP.NET ou peuvent être centralisées dans des fichiers de classe dans le App_Code
dossier ou dans un projet de bibliothèque de classes distinct. Le déplacement de la fonction de mise en forme hors de la classe code-behind de la page ASP.NET est idéal si vous envisagez d’utiliser la même fonction de mise en forme dans plusieurs pages ASP.NET ou dans d’autres applications web ASP.NET.
Pour illustrer les fonctions de mise en forme, supposons que les informations sur le produit incluent le texte [DISCONTINUED] en regard du nom du produit s’il est interrompu. En outre, mettons le prix en surbrillance jaune s’il est inférieur à 20,00 $ (comme nous l’avons fait dans l’exemple ItemDataBound
de gestionnaire d’événements) ; si le prix est de 20,00 $ ou plus, n’affichez pas le prix réel, mais plutôt le texte, appelez pour obtenir un devis de prix. La figure 4 montre une capture d’écran de la liste des produits avec ces règles de mise en forme appliquées.
Figure 4 : Pour les produits chers, le prix est remplacé par le texte, appelez pour obtenir un devis (cliquez pour afficher l’image en taille réelle)
Étape 1 : Créer les fonctions de mise en forme
Pour cet exemple, nous avons besoin de deux fonctions de mise en forme, l’une qui affiche le nom du produit avec le texte [DISCONTINUED], si nécessaire, et l’autre qui affiche un prix mis en surbrillance s’il est inférieur à 20,00 $, ou le texte, Veuillez appeler pour obtenir un devis dans le cas contraire. Créez ces fonctions dans la classe code-behind de la page ASP.NET et nommez-les DisplayProductNameAndDiscontinuedStatus
et DisplayPrice
. Les deux méthodes doivent retourner le code HTML à restituer sous forme de chaîne et toutes deux doivent être marquées Protected
(ou Public
) pour être appelées à partir de la partie de syntaxe déclarative de la page ASP.NET. Le code de ces deux méthodes est le suivant :
Protected Function DisplayProductNameAndDiscontinuedStatus _
(productName As String, discontinued As Boolean) As String
' Return just the productName if discontinued is false
If Not discontinued Then
Return productName
Else
' otherwise, return the productName appended with the text "[DISCONTINUED]"
Return String.Concat(productName, " [DISCONTINUED]")
End If
End Function
Protected Function DisplayPrice(product As Northwind.ProductsRow) As String
' If price is less than $20.00, return the price, highlighted
If Not product.IsUnitPriceNull() AndAlso product.UnitPrice < 20 Then
Return String.Concat("<span class="AffordablePriceEmphasis">", _
product.UnitPrice.ToString("C"), "</span>")
Else
' Otherwise return the text, "Please call for a price quote"
Return "<span>Please call for a price quote</span>"
End If
End Function
Notez que la DisplayProductNameAndDiscontinuedStatus
méthode accepte les valeurs des champs de productName
données et discontinued
en tant que valeurs scalaires, tandis que la DisplayPrice
méthode accepte une ProductsRow
instance (plutôt qu’une unitPrice
valeur scalaire). L’une ou l’autre approche fonctionnera ; Toutefois, si la fonction de mise en forme fonctionne avec des valeurs scalaires qui peuvent contenir des valeurs de base de données NULL
(telles que UnitPrice
les valeurs ; ni ProductName
Discontinued
autoriser NULL
), une attention particulière doit être prise dans la gestion de ces entrées scalaires.
En particulier, le paramètre d’entrée doit être de typeObject
, car la valeur entrante peut être une DBNull
instance au lieu du type de données attendu. En outre, une case activée doit être effectuée pour déterminer si la valeur entrante est une valeur de base de donnéesNULL
. Autrement dit, si nous voulions que la DisplayPrice
méthode accepte le prix comme valeur scalaire, nous devons utiliser le code suivant :
Protected Function DisplayPrice(ByVal unitPrice As Object) As String
' If price is less than $20.00, return the price, highlighted
If Not Convert.IsDBNull(unitPrice) AndAlso CType(unitPrice, Decimal) < 20 Then
Return String.Concat("<span class="AffordablePriceEmphasis">", _
CType(unitPrice, Decimal).ToString("C"), "</span>")
Else
' Otherwise return the text, "Please call for a price quote"
Return "<span>Please call for a price quote</span>"
End If
End Function
Notez que le unitPrice
paramètre d’entrée est de type Object
et que l’instruction conditionnelle a été modifiée pour vérifier si unitPrice
est DBNull
ou non. En outre, étant donné que le unitPrice
paramètre d’entrée est passé en tant que Object
, il doit être converti en valeur décimale.
Étape 2 : Appel de la fonction de mise en forme à partir de l’élément ItemTemplate de DataList
Avec les fonctions de mise en forme ajoutées à notre classe code-behind de la page ASP.NET, il ne reste plus qu’à appeler ces fonctions de mise en forme à partir de DataList s ItemTemplate
. Pour appeler une fonction de mise en forme à partir d’un modèle, placez l’appel de fonction dans la syntaxe de liaison de données :
<%# MethodName(inputParameter1, inputParameter2, ...) %>
Dans dataList s, ItemTemplate
le ProductNameLabel
contrôle Label Web affiche actuellement le nom du produit en affectant à sa Text
propriété le résultat de <%# Eval("ProductName") %>
. Pour qu’elle affiche le nom et le texte [DISCONTINUED], si nécessaire, mettez à jour la syntaxe déclarative afin qu’elle affecte à la Text
propriété la valeur de la DisplayProductNameAndDiscontinuedStatus
méthode. Dans ce cas, nous devons transmettre le nom du produit et les valeurs abandonnées à l’aide de la Eval("columnName")
syntaxe . Eval
retourne une valeur de type Object
, mais la DisplayProductNameAndDiscontinuedStatus
méthode attend des paramètres d’entrée de type String
; Boolean
par conséquent, nous devons caster les valeurs retournées par la Eval
méthode en types de paramètres d’entrée attendus, comme suit :
<h4>
<asp:Label ID="ProductNameLabel" runat="server"
Text='<%# DisplayProductNameAndDiscontinuedStatus((string) Eval("ProductName"),
(bool) Eval("Discontinued")) %>'>
</asp:Label>
</h4>
Pour afficher le prix, nous pouvons simplement définir la UnitPriceLabel
propriété Label s Text
sur la valeur retournée par la méthode, comme nous l’avons DisplayPrice
fait pour afficher le nom du produit et le texte [DISCONTINUED]. Toutefois, au lieu de passer le UnitPrice
en tant que paramètre d’entrée scalaire, nous transmettons à la place l’ensemble ProductsRow
de la instance :
<asp:Label ID="UnitPriceLabel" runat="server"
Text='<%# DisplayPrice((Northwind.ProductsRow)
((System.Data.DataRowView) Container.DataItem).Row) %>'>
</asp:Label>
Une fois les appels aux fonctions de mise en forme en place, prenez un moment pour voir notre progression dans un navigateur. Votre écran doit ressembler à la figure 5, avec les produits abandonnés, y compris le texte [DISCONTINUED] et les produits dont le prix est supérieur à 20,00 $ et dont le prix est remplacé par le texte Appelez pour obtenir un devis .
Figure 5 : Pour les produits coûteux, le prix est remplacé par le texte, appelez pour obtenir un devis (cliquez pour afficher l’image en taille réelle)
Résumé
La mise en forme du contenu d’un contrôle DataList ou Repeater basé sur les données peut être effectuée à l’aide de deux techniques. La première technique consiste à créer un gestionnaire d’événements pour l’événement ItemDataBound
, qui se déclenche lorsque chaque enregistrement de la source de données est lié à un nouveau DataListItem
ou RepeaterItem
. Dans le ItemDataBound
gestionnaire d’événements, les données de l’élément actif peuvent être examinées, puis la mise en forme peut être appliquée au contenu du modèle ou, pour DataListItem
s, à l’élément entier lui-même.
Vous pouvez également effectuer une mise en forme personnalisée via des fonctions de mise en forme. Une fonction de mise en forme est une méthode qui peut être appelée à partir des modèles DataList ou Repeater qui retourne le code HTML à émettre à sa place. Souvent, le code HTML retourné par une fonction de mise en forme est déterminé par les valeurs liées à l’élément actif. Ces valeurs peuvent être transmises à la fonction de mise en forme, soit en tant que valeurs scalaires, soit en passant l’objet entier lié à l’élément (par exemple, le ProductsRow
instance).
Bonne programmation !
À propos de l’auteur
Scott Mitchell, auteur de sept livres ASP/ASP.NET et fondateur de 4GuysFromRolla.com, travaille avec les technologies Web Microsoft depuis 1998. Scott travaille comme consultant indépendant, formateur et écrivain. Son dernier livre est Sams Teach Yourself ASP.NET 2.0 in 24 Heures. Il est accessible à l’adressemitchell@4GuysFromRolla.com . ou via son blog, qui peut être trouvé à l’adresse http://ScottOnWriting.NET.
Un merci spécial à
Cette série de tutoriels a été examinée par de nombreux réviseurs utiles. Les principaux réviseurs de ce tutoriel étaient Yaakov Ellis, Randy Schmidt et Liz Shulok. Vous souhaitez consulter mes prochains articles MSDN ? Si c’est le cas, déposez-moi une ligne à mitchell@4GuysFromRolla.com.