Création d'un gridview dans un repeater

Contenu du snippet

Bonjour,

L'exemple suivant à pour but de répondre (de façon simple) à deux questions qui ressortent souvent dans les forums :
1 ? Comment ajouter et gérer un contrôle dans une Repeater (Dans notre exemple un GridView).
2 ? Comment ajouter et gérer un bouton personnalisé dans un GridView.

Pour utiliser mon exemple, vous devez avant tout créer une base de donnée nommée viewgrid puis une table Utilisateurs.
Voici le script SQL de création de la table :
CREATE TABLE [dbo].[Utilisateurs] (
[ID] [int] IDENTITY (1, 1) NOT NULL ,
[Nom] [varchar] (30) COLLATE French_CI_AS NOT NULL ,
[Prenom] [varchar] (30) COLLATE French_CI_AS NOT NULL ,
[Ville] [varchar] (30) COLLATE French_CI_AS NOT NULL
) ON [PRIMARY]
GO

Puis remplir la table avec quelques lignes de tests. Attention à bien mettre plusieurs fois la même ville pour que l'exemple soit concluant (voir la photo de l'exemple).

Voilà, bon code.

Walter

Source / Exemple :


' ********************************************
' *** A copier dans la page default.aspx :
' ********************************************
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
    <title>Un GridView dans un Repeater</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <b>Un GridView dans un Repeater</b><br />&nbsp;<br />
        <asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_ItemDataBound">
            <ItemTemplate>
                <b>Ville : <%#Container.DataItem("Ville")%></b><br />
                <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" >
                    <Columns>
                        <asp:BoundField DataField="Nom" HeaderText="Nom"  />
                        <asp:BoundField DataField="Prenom" HeaderText="Pr&#233;nom" />
                        <asp:BoundField DataField="Ville" HeaderText="Ville" />
                        <asp:TemplateField>
                            <ItemTemplate>
                                <asp:Button ID="btEditer" runat="server" Text="Editer" CommandArgument='<%# Container.DataItem("ID")%>' OnCommand="GridView1_Editer" />
                            </ItemTemplate>
                        </asp:TemplateField>
                    </Columns>
                </asp:GridView>
                &nbsp;<br />
            </ItemTemplate>
        </asp:Repeater>
        <asp:Label ID="lbMessage" runat="server" Text="" EnableViewState="False" ></asp:Label>
    </div>
    </form>
</body>
</html>

' ********************************************
' *** A copier dans la page default.aspx.vb :
' ********************************************
Imports System.Data
Imports System.Data.SqlClient

Partial Class _Default
    Inherits System.Web.UI.Page

    ' Chaine de connexion à la base de données
    Public chaineConnexion As String = "Data Source=localhost;Integrated Security=True;database=viewgrid"

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        ' Si la page n'est pas en PostBack
        If Not Page.IsPostBack Then

            ' Génération du Repeater
            Repeater1.DataSource = dsListeVilles()
            Repeater1.DataBind()

        End If

    End Sub

    ''' <summary>
    ''' Sub déclanchée au moment de la construction d'un élément du Repeater
    ''' </summary>
    Sub Repeater1_ItemDataBound(ByVal Sender As Object, ByVal e As RepeaterItemEventArgs)

        ' Si il s'agit d'un élément Item ou AlternatingItem.
        If (e.Item.ItemType = ListItemType.Item) Or (e.Item.ItemType = ListItemType.AlternatingItem) Then

            ' Récupération du nom de la ville.
            Dim myVille As String = DirectCast(e.Item.DataItem, DataRowView).Item("Ville").ToString

            ' Stock le GridView1 dans une variable
            Dim myGridView As GridView = CType(e.Item.FindControl("GridView1"), GridView)

            ' Construction du GridView
            myGridView.DataSource = dsListeUtilisateurs(myVille)
            myGridView.DataBind()

        End If

    End Sub

    ''' <summary>
    ''' Evénement sur le bouton Editer du GridView
    ''' </summary>
    Protected Sub GridView1_Editer(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.CommandEventArgs)

        ' Récupération du bouton
        Dim myButton As Button = CType(sender, Button)

        ' Affiche un message
        lbMessage.Text = "ID de l'utilisateur : " & myButton.CommandArgument

    End Sub

    ''' <summary>
    ''' Retourne un DataSet contenant la liste de toutes les villes
    ''' </summary>
    Private Function dsListeVilles() As DataSet

        ' Création d'une instance de connexion
        Dim myConnexion As SqlConnection = New SqlConnection(chaineConnexion)

        ' Création d'un DataSet
        Dim myDataset As New DataSet

        ' Envoie de la requette
        Dim dtr As New SqlClient.SqlDataAdapter("Select Distinct Ville from Utilisateurs Order By Ville", myConnexion)

        ' Peuple le DataSet
        dtr.Fill(myDataset)

        ' Retourne le DataSet
        Return myDataset

    End Function

    ''' <summary>
    ''' Retourne un DataSet contenant les utilisateurs pour une ville
    ''' </summary>
    Private Function dsListeUtilisateurs(ByVal nomVille As String) As DataSet

        ' Création d'une instance de connexion
        Dim myConnexion As SqlConnection = New SqlConnection(chaineConnexion)

        ' Création d'un DataSet
        Dim myDataset As New DataSet

        ' Envoie de la requette
        Dim dtr As New SqlClient.SqlDataAdapter("Select * from Utilisateurs Where (Ville = '" & nomVille & "') Order By Nom", myConnexion)

        ' Peuple le DataSet
        dtr.Fill(myDataset)

        ' Retourne le DataSet
        Return myDataset

    End Function

End Class

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.