Share via


Procédure pas à pas : sélection et filtrage d'un sous-ensemble de données avec les contrôles LinqDataSource et GridView

Mise à jour : novembre 2007

Cette procédure pas à pas décrit comment utiliser le contrôle LinqDataSource pour créer un groupe de données non limitées aux valeurs d'une seule table de base de données. Vous utiliserez un contrôle LinqDataSource pour sélectionner un sous-ensemble de données de la table, calculer de nouvelles valeurs à partir des valeurs sélectionnées et récupérer des valeurs de tables connexes. Vous filtrerez également les enregistrements à renvoyer. Vous afficherez ensuite le nouveau jeu de valeurs en utilisant un contrôle GridView.

La procédure pas à pas illustre l'accès aux données en sélectionnant tout d'abord des valeurs de la table Product dans l'exemple de base de données AdventureWorks. La table Product contient des colonnes qui sont des clés étrangères vers d'autres tables et vous récupérerez des données de ces tables connexes.

Vous utilisez l'Concepteur Objet/Relationnel pour créer une classe qui représente les tables de la base de données qui contiennent les valeurs. Le contrôle LinqDataSource interagira avec cette classe générée afin de récupérer et mettre à jour des données.

Composants requis

Pour implémenter les étapes de cette procédure pas à pas, vous aurez besoin des éléments suivants :

  • Visual Studio 2008 ou Visual Web Developer Express.

  • avoir un site Web ASP.NET.

  • SQL Server Express Edition. Si vous disposez de SQL Server, vous pouvez l'utiliser, mais vous devrez apporter de légères modifications à certaines procédures.

  • La base de données AdventureWorks installée sur votre ordinateur. Pour télécharger la base de données AdventureWorks, consultez Exemples et exemples de base de données SQL Server 2005.

  • Une chaîne de connexion dans le site Web qui se connecte à la base de données AdventureWorks.

Création de classes pour représenter des entités de base de données

Pour utiliser des données d'une base de données vous servant du contrôle LinqDataSource, vous devez créer des classes qui représentent des entités de base de données. Vous pouvez utiliser un outil de Visual Studio 2008 pour créer ces classes.

Pour créer des classes pour les tables de la base de données AdventureWorks

  1. Si le site Web ne possède pas déjà un dossier App_Code, dans Explorateur de solutions, cliquez avec le bouton droit sur le nom du projet, cliquez sur Ajouter le dossier ASP.NET, puis cliquez sur App_Code.

  2. Cliquez avec le bouton droit sur le dossier App_Code, puis cliquez sur Ajouter un nouvel élément.

    La boîte de dialogue Ajouter un nouvel élément s'affiche.

  3. Sous Modèles Visual Studio installés, sélectionnez Classes LINQ to SQL, nommez le fichier AdventureWorks.dbml puis cliquez sur Ajouter.

    Le Concepteur Objet/Relationnel s'affiche.

  4. Dans l'Explorateur de serveurs, faites glisser la table Product (Production) dans la fenêtre du Concepteur Objet/Relationnel.

    La table Product (Production) et ses colonnes sont représentées dans la fenêtre du Concepteur O/R comme une entité nommée Product.

  5. Faites glisser la table ProductSubCategory et la table UnitMeasure dans la fenêtre du concepteur.

    Ces tables et leurs colonnes sont représentées comme des entités dans la fenêtre du concepteur. La relation entre Product et les deux tables connexes est indiquée par un trait en pointillé.

  6. Enregistrez le fichier AdventureWorks.dbml.

  7. Dans l'Explorateur de solutions, ouvrez le fichier AdventureWorks.designer.cs ou AdventureWorks.designer.vb.

    Le fichier contient des classes nommées AdventureWorksDataContext, Product, ProductSubCategory et UnitMeasure. La classe Product contient des propriétés nommées ProductSubcategory, UnitMeasure et UnitMeasure1. Ces propriétés sont marquées comme clés étrangères via l'attribut AssociationAttribute. Elles retournent des objets qui représentent les tables de ProductSubCategory et UnitMeasure.

    La propriété UnitMeasure représente la relation de clé étrangère pour la valeur dans la colonne SizeUnitMeasureCode. La propriété UnitMeasure1 représente la clé étrangère pour la colonne WeightUnitMeasureCode.

Sélection des colonnes à récupérer

Si vous ne spécifiez pas de valeur pour la propriété Select, le contrôle LinqDataSource retourne toutes les propriétés (colonnes) de la classe qui représente la table de la base de données.

Pour récupérer un sous-ensemble de données avec le contrôle LinqDataSource

  1. Dans Visual Studio, créez une page Web ASP.NET et basculez en mode Source.

  2. À partir de l'onglet Données de la boîte à outils, faites glisser un contrôle LinqDataSource et déposez-le dans l'élément form de la page Web.

    Vous pouvez conserver à la propriété ID la valeur LinqDataSource1.

  3. Affectez la valeur AdventureWorksDataContext à la propriété ContextTypeName.

    La classe AdventureWorksDataContext est une classe de contexte de données qui représente la base de données AdventureWorks. Elle contient une propriété pour chaque table de la base de données.

  4. Affectez la valeur Products à la propriété TableName.

  5. Affectez à la propriété Select le code suivant :

    new(Name, Size, StandardCost, ListPrice, DaysToManufacture)
    

    En définissant la propriété Select, vous restreignez les propriétés pouvant être récupérées de la classe Products. Lorsque vous sélectionnez plusieurs propriétés d'une classe, vous devez inclure ces propriétés dans l'opérateur new. Ceci car le contrôle LinqDataSource ne retourne pas une instance de la classe spécifiée dans la propriété TableName. Au lieu de cela, il retourne une instance d'une classe créée dynamiquement qui contient uniquement ces propriétés.

Filtrage des enregistrements à récupérer

Si vous ne spécifiez pas de valeur pour la propriété Where, le contrôle LinqDataSource retourne tous les enregistrements de la table de la base de données. Vous pouvez filtrer les enregistrements à retourner en définissant la propriété Where. Vous pouvez filtrer par une valeur statique telle que ListPrice > 0 pour retourner uniquement les enregistrements dont la valeur de la propriété ListPrice est supérieure à zéro. Vous pouvez également assigner une valeur au moment de l'exécution en ajoutant des paramètres à la collection WhereParameters.

Pour filtrer les données au moment de l'exécution avec le contrôle LinqDataSource

  1. Ajoutez un contrôle DropDownList à la page Web et affectez à sa propriété AutoPostBack la valeur true.

    Laissez le nom par défaut DropDownList1.

  2. Ajoutez quatre éléments de liste au contrôle DropDownList1 et affectez-leur les valeurs 0, 25, 100 et 400.

  3. Ajoutez un élément WhereParameters entre les balises d'ouverture et de fermeture du contrôle LinqDataSource.

  4. Ajoutez un contrôle ControlParameter à la collection WhereParameters.

  5. Affectez à la propriété ControlID du contrôle ControlParameter la valeur DropDownList1. Affectez à la propriété Name la valeur SelectedPrice et à la propriété Type la valeur Int32.

    Au moment de l'exécution, le paramètre SelectedPrice contiendra la valeur sélectionnée dans DropDownList1.

  6. Affectez la valeur ListPrice > @SelectedPrice à la propriété Where afin de sélectionner uniquement les enregistrements dont la valeur ListPrice est supérieure à la valeur sélectionnée par l'utilisateur.

    L'exemple de code suivant illustre le balisage déclaratif des contrôles DropDownList et LinqDataSource.

    <asp:DropDownList AutoPostBack="true" ID="DropDownList1" >
      <asp:ListItem Value="0"></asp:ListItem>
      <asp:ListItem Value="25"></asp:ListItem>
      <asp:ListItem Value="100"></asp:ListItem>
      <asp:ListItem Value="400"></asp:ListItem>
    </asp:DropDownList>
    <asp:LinqDataSource 
      ContextTypeName="AdventureWorksDataContext" 
      TableName="Products" 
      Where="ListPrice > @SelectedPrice" 
      Select="new(Name, Size, StandardCost, ListPrice, DaysToManufacture)" 
      ID="LinqDataSource1" 
      >
      <WhereParameters>
        <asp:ControlParameter 
          Name="SelectedPrice" 
          DefaultValue="0" 
          ControlID="DropDownList1" 
          Type="Int32" />
      </WhereParameters>
    </asp:LinqDataSource>
    

Ajout d'un contrôle pour afficher les données

Vous pouvez à présent ajouter un contrôle GridView et le lier au contrôle LinqDataSource. Le contrôle GridView permet aux utilisateurs de consulter des lignes de données gérées par le contrôle LinqDataSource. Vous permettrez aux utilisateurs de trier et de naviguer dans les données.

Pour afficher le sous-ensemble de données dans le contrôle GridView

  1. Sous l'onglet Données de la Boîte à outils, double-cliquez sur le contrôle GridView pour l'ajouter à la page.

  2. Affectez la valeur LinqDataSource1 à la propriété DataSourceID du contrôle GridView.

    Cela lie le contrôle GridView aux données retournées par le contrôle LinqDataSource.

  3. Affectez aux propriétés AllowPaging et AllowSorting la valeur true.

    Pour que le tri et la pagination fonctionnent avec un contrôle LinqDataSource, les propriétés AutoSort et AutoPage doivent avoir la valeur true. Par défaut, ces deux valeurs sont true.

  4. Affectez à la propriété AutoGenerateColumns la valeur false.

  5. Pour spécifier l'ordre des colonnes, créez un contrôle BoundField pour chaque propriété (Name, Size, StandardCost, ListPrice et DaysToManufacture) que vous avez spécifiée dans la propriété Where du contrôle LinqDataSource.

    L'exemple suivant illustre le balisage déclaratif du contrôle GridView.

    <asp:GridView 
      AllowPaging="true" 
      AllowSorting="true" 
      AutoGenerateColumns="false" 
      DataSourceID="LinqDataSource1" 
      ID="GridView1" 
      >
      <Columns>
        <asp:BoundField 
            DataField="Name" 
            HeaderText="Name" 
            SortExpression="Name" />
        <asp:BoundField 
            DataField="Size" 
            HeaderText="Size" 
            SortExpression="Size" />
        <asp:BoundField 
            DataField="StandardCost" 
            HeaderText="Standard Cost" 
            SortExpression="StandardCost" />
        <asp:BoundField 
            DataField="ListPrice" 
            HeaderText="List Price" 
            SortExpression="ListPrice" />
        <asp:BoundField 
            DataField="DaysToManufacture" 
            HeaderText="Days To Manufacture" 
            SortExpression="DaysToManufacture" />
      </Columns>
    </asp:GridView>
    
  6. Enregistrez la page puis appuyez sur CTRL+F5 pour l'afficher dans un navigateur.

    Le contrôle GridView affiche les colonnes pour les enregistrements actifs de la table Product. Vous pouvez trier les enregistrements en cliquant sur les en-têtes des colonnes et vous pouvez faire défiler les pages d'enregistrements en cliquant sur les numéros de page.

Utilisation de valeurs de source de données pour calculer de nouvelles valeurs

Outre la sélection des valeurs de la table de base de données, vous pouvez calculer de nouvelles valeurs. Vous pouvez vouloir le faire si vous souhaitez afficher une valeur qui peut être obtenue uniquement en exécutant un calcul sur une des valeurs de la source de données. Vous pouvez alors afficher ces valeurs dans le contrôle GridView.

Pour calculer et afficher de nouvelles valeurs depuis la source de données

  1. Affectez à la propriété Select la valeur suivante :

    new(Name, 
        Size, 
        StandardCost, 
        ListPrice, 
        ListPrice - StandardCost as PriceDifference, 
        DaysToManufacture / 5.0 as WeeksToManufacture)
    

    Les valeurs supplémentaires, PriceDifference et WeeksToManufacture n'existent pas dans la base de données. Elles peuvent être affichées uniquement après calcul sur les valeurs de la base de données.

  2. Dans le contrôle GridView, ajoutez des contrôles BoundField pour les colonnes PriceDifference et WeeksToManufacture et supprimez le contrôle BoundField pour DaysToManufacture.

    L'exemple suivant illustre le balisage déclaratif des contrôles calculés BoundField.

        <asp:BoundField 
            DataField="PriceDifference" 
            HeaderText="Price Difference" 
            SortExpression="Price Difference" />
        <asp:BoundField 
            DataField="WeeksToManufacture" 
            HeaderText="Weeks To Manufacture" 
            SortExpression="WeeksToManufacture" />
    
  3. Enregistrez la page puis appuyez sur CTRL+F5 pour l'afficher dans un navigateur.

    Le contrôle GridView affiche les colonnes pour les enregistrements actifs et les valeurs calculées de la table Product.

Sélection de valeurs de tables connexes

Vous pouvez récupérer des valeurs d'une table et des valeurs de toute table connexe à l'aide d'un contrôle LinqDataSource. Lorsqu'une table possède une relation de clé étrangère avec d'autres tables, l'Concepteur Objet/Relationnel génère une classe d'entité qui contient des propriétés relatives à chaque table connexe. Ces propriétés retournent un objet qui représente la table connexe. L'objet contient ensuite des propriétés pour toutes les colonnes de la table connexe. Vous pouvez sélectionner des valeurs d'une table connexe en accédant à l'objet dans la classe qui représente cette table connexe.

Pour récupérer des données de tables connexes

  1. Affectez à la propriété Select du contrôle LinqDataSource la valeur suivante :

    new(Name, 
        Size, 
        UnitMeasure.Name as SizeMeasureName, 
        Weight, 
        UnitMeasure1.Name as WeightMeasureName, 
        ProductSubcategory.Name as SubCategoryName)
    

    Les propriétés SizeMeasureName, WeightMeasureName et SubCategoryName contiennent des valeurs des tables qui possèdent des relations de clé étrangère avec la table Products.

  2. Pour retourner uniquement les produits qui possèdent une unité de taille ou de poids, affectez à la propriété Where la valeur suivante :

    WeightUnitMeasureCode != null || SizeUnitMeasureCode != null
    

    Le filtrage sur ces valeurs illustre comment les relations de clé étrangère sont gérées par le contrôle LinqDataSource. L'opérateur || exécute une opération OR logique. Par conséquent, seuls les enregistrements ayant une valeur attribuée à au moins une des clés étrangères seront retournés.

    L'exemple suivant illustre le balisage déclaratif du contrôle LinqDataSource.

    <asp:LinqDataSource 
      ContextTypeName="AdventureWorksDataContext" 
      TableName="Products" 
      Where="WeightUnitMeasureCode != null || 
             SizeUnitMeasureCode != null"
      Select="new(Name,
                  Size, 
                  UnitMeasure.Name as SizeMeasureName, 
                  Weight, 
                  UnitMeasure1.Name as WeightMeasureName, 
                  ProductSubCategory.Name as SubCategoryName)" 
      ID="LinqDataSource1" 
      >
    </asp:LinqDataSource>
    
  3. Dans le contrôle GridView, ajoutez un contrôle BoundField pour chaque colonne à afficher. Ces colonnes sont Name, Size, SizeMeasureName, Weight, WeightMeasureName et SubCategoryName.

    L'exemple suivant illustre le balisage déclaratif du contrôle GridView.

    <asp:GridView 
      AllowPaging="true" 
      AllowSorting="true" 
      AutoGenerateColumns="false" 
      DataSourceID="LinqDataSource1" 
      ID="GridView1" 
      >
      <Columns>
        <asp:BoundField 
              DataField="Name" 
              HeaderText="Name" 
              SortExpression="Name" />
        <asp:BoundField 
              DataField="Size" 
              HeaderText="Size" 
              SortExpression="Size" />
        <asp:BoundField 
              DataField="SizeMeasureName" 
              HeaderText="Size Unit of Measurement" 
              SortExpression="SizeMeasureName" />
        <asp:BoundField 
              DataField="Weight" 
              HeaderText="Weight" 
              SortExpression="Weight" />
        <asp:BoundField 
              DataField="WeightMeasureName" 
              HeaderText="Weight Unit of Measurement" 
              SortExpression="WeightMeasureName" />
        <asp:BoundField 
              DataField="SubCategoryName" 
              HeaderText="Subcategory Name" 
              SortExpression="SubCategoryName" />
      </Columns>
    </asp:GridView>
    
  4. Enregistrez la page puis appuyez sur CTRL+F5 pour l'afficher dans un navigateur.

    Le contrôle GridView affiche les valeurs des tables de Product, ProductSubCategory et UnitMeasure. Vous pouvez trier et faire défiler les pages d'enregistrements.

Étapes suivantes

Dans cette procédure pas à pas, vous avez appris comment personnaliser les colonnes et enregistrements à retourner dans une requête en utilisant le contrôle LinqDataSource. Vous pouvez ajouter des fonctionnalités supplémentaires au contrôle LinqDataSource, telles celles indiquées ci-dessous.

Voir aussi

Concepts

Vue d'ensemble du contrôle serveur Web LinqDataSource