Création d'un gridview dans un repeater

Soyez le premier à donner votre avis sur cette source.

Snippet vu 18 202 fois - Téléchargée 17 fois

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

Ajouter un commentaire

Commentaires

Messages postés
10
Date d'inscription
mercredi 8 août 2007
Statut
Membre
Dernière intervention
21 janvier 2008

Salut j'essaye de m'inspirer de cette source pour un mini projet, mais je fais ça en C#, et j'ai une erreur que je n'arrive à résoudre.

Erreur 1 Le type ou le nom d'espace de noms 'DataRowView' est introuvable (une directive using ou une référence d'assembly est-elle manquante ?) C:\Documents and Settings\Silver Claw\Mes documents\Visual Studio 2005\WebSites\WebSite2\Products.aspx 21

Si quelqu'un pouvait m'aider merci d'avance.
Messages postés
28
Date d'inscription
dimanche 14 septembre 2003
Statut
Membre
Dernière intervention
4 juillet 2010

Merci pour tes conseilles, je corrige tout de suite.
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
25
héhé : pas mal :)

Mais 3 remarques :
- au lieu d'utiliser l'horrible hiddenField pour récuperer ta valeur, tu peux faire un directcast(e.item.DataItem, datarowview)["Ville"]
- évite de faire plein de findcontrol / cast inutile. Ce sont des opérations couteuses. Quand tu recherches ton gridview, stock le dans une variable tu économisera un findcontrol et un cast
- évite d'utiliser la fonction eval qui elle aussi est couteuse (utilise la reflection). Comme tu utilises VB tu peux faire directement <%#Container.DataItem["Ville"]%>, pas besoin de caster (un des rares avantages de VB). En C# ce serait <%# ((DataRowView)Container.DataItem)["Ville"] %> et pour info en IronPython, jscript managed et peut être vbx : <%#Container.DataItem.Ville %> (IronRuby n'est pas encore annoncé officiellement)

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.