Colorer les lignes d’une GridView avec JavaScript
Objectifs:
- Manipuler le contrôle serveur GridView
- Manipuler les lignes d'un contrôle serveur avec JavaScript
- Associer des événements JavaScript aux lignes du contrôle GridView
Énoncé:
Créer une page ASP.Net qui propose une fonctionnalité de coloration de l’arrière-plan des lignes d’une grille (GridView) contenant des CheckBox en utilisant 2 couleurs :
- Aqua: si la ligne est sélectionnée
- Orange: au survol de la souris
Si une ligne est sélectionnée ou survolée, elle est mise en évidence sinon il faut remettre sa couleur d’origine.
![Colorer-lignes-GridView](/images/articles/asp/Colorer-lignes-GridView.png)
Implémenter cette fonctionnalité dans l’exercice Suppression de plusieurs lignes d’une GridView avec CheckBox en utilisant JavaScript dans le contrôle GridView afin de réduire les PostBacks.
- Utiliser les événements Click, MouseOver et MouseOut du Javascript
- Utiliser l'événement RowDataBound du contrôle GridView pour associer les événements Javascript à chaque ligne.
Pour commencer, il faut utiliser le contrôle GridView et l'associer à une source de données puis ajouter une colonne de type CheckBox:
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" CellPadding="4" DataKeyNames="Id" DataSourceID="SqlDataSource1" EmptyDataText="Il n'y a aucun enregistrement de données à afficher." ForeColor="#333333" GridLines="None" BorderStyle="Solid" OnRowDataBound="GridView1_RowDataBound"> <AlternatingRowStyle BackColor="White" ForeColor="#284775" /> <Columns> <asp:TemplateField HeaderText="Action"> <ItemTemplate> <asp:CheckBox ID="CheckBox1" runat="server" onclick = "Case_Click(this)" /> </ItemTemplate> </asp:TemplateField> <asp:BoundField DataField="Id" HeaderText="Id" ReadOnly="True" SortExpression="Id" /> <asp:BoundField DataField="Nom" HeaderText="Nom" SortExpression="Nom" /> <asp:BoundField DataField="Prenom" HeaderText="Prenom" SortExpression="Prenom" /> <asp:BoundField DataField="Adresse" HeaderText="Adresse" SortExpression="Adresse" /> <asp:BoundField DataField="Ville" HeaderText="Ville" SortExpression="Ville" /> </Columns> <EditRowStyle BackColor="#999999" /> <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" /> <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" /> <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" /> <RowStyle BackColor="#F7F6F3" ForeColor="#333333" /> <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" /> <SortedAscendingCellStyle BackColor="#E9E7E2" /> <SortedAscendingHeaderStyle BackColor="#506C8C" /> <SortedDescendingCellStyle BackColor="#FFFDF8" /> <SortedDescendingHeaderStyle BackColor="#6F8DAE" /> </asp:GridView>
Dans le code ASPX généré, il faut ajouter l'appel aux fonctions GridView1_RowDataBound (C#) et Case_Click (Javascript) qui correspondent respectivement aux événements RowDataBound du GridView et onClick de la case à cocher.
La fonction GridView1_RowDataBound permet d'attacher les événements MouseOver et MouseOut aux lignes du contrôle GridView:
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { e.Row.Attributes.Add("onmouseover", "Survol(this, event)"); e.Row.Attributes.Add("onmouseout", "Survol(this, event)"); } }
Les deux fonctions Javascript Case_Click et Survol (à mettre dans la balise head) permettent de changer la couleur d'une ligne si elle est sélectionnée ou survolée:
<script type = "text/javascript"> function Case_Click(objRef) { //Récupérer la ligne à partir de son checkbox var row = objRef.parentNode.parentNode; if (objRef.checked) { //Si la case est sélectionnée on change la couleur en Bleu row.style.backgroundColor = "aqua"; } else { //S'elle n'est pas sélectionée on remet la couleur d'origine //Pas besoin de faire ce test si le thème par défaut (blanc) est utilisé if (row.rowIndex % 2 == 0) { row.style.backgroundColor = "white"; } else { row.style.backgroundColor = "#F7F6F3"; } } } function Survol(objRef, evt) { var checkbox = objRef.getElementsByTagName("input")[0]; if (evt.type == "mouseover") { objRef.style.backgroundColor = "orange"; } else { if (checkbox.checked) { objRef.style.backgroundColor = "aqua"; } else if (evt.type == "mouseout") { if (objRef.rowIndex % 2 == 0) { objRef.style.backgroundColor = "white"; } else { objRef.style.backgroundColor = "#F7F6F3"; } } } } </script>