Dans l'article précédent, nous savions déjà comment associer le ControlParameter (paramètre de contrôle) à la propriété SelectedValue du GridView pour implémenter une table de données maître-esclave. La propriété SelectedValue renvoie la valeur du premier champ spécifié par la propriété DataKeyNames. Vous pouvez également spécifier plusieurs valeurs de champ séparées par des virgules pour la propriété DataKeyNames. Par exemple, vous devrez peut-être transmettre plusieurs valeurs à la source de données à partir de la table. Ces valeurs de champ clé supplémentaires sont exposées via la propriété SelectedDataKey, qui renvoie un objet DataKey contenant la paire nom/valeur du champ clé. ControlParameter peut même référencer ces clés en définissant la propriété PropertyName dans l'expression (par exemple, SelectedDataKey.Values("title_id")).
<asp:ControlParameter Name="FirstKey" ControlID="MasterGrid" PropertyName="SelectedDataKey.Values[0]"/>
<asp:ControlParameter Name="SecondKey" ControlID="MasterGrid" PropertyName="SelectedDataKey.Values[1]"/>
L'exemple suivant illustre le code qui énumère la collection DataKeys et obtient la valeur du champ clé à partir du SelectedDataKey du GridView :
sous-protégé GridView1_SelectedIndexChanged (expéditeur ByVal en tant qu'objet, ByVal et système.EventArgs)
Response.Write("<b>SelectedDataKey.Value : </b>" & Server.HtmlEncode(GridView1.SelectedDataKey.Value) & "<br />")
Response.Write("<b>DataKey Champ 1 : </b>" & Server.HtmlEncode(GridView1.SelectedDataKey.Values("au_id")) & "<br />")
Response.Write("<b>DataKey Champ 2 : </b>" & Server.HtmlEncode(GridView1.SelectedDataKey.Values("title_id")) & "<br />")
Fin du sous-marin
Sous-GridView1_DataBound protégé (expéditeur ByVal en tant qu'objet, ByVal et système.EventArgs)
Touche Dim comme DataKey
Response.Write("<b>GridView DataKeys : </b><br />")
Pour chaque clé dans GridView1.DataKeys
Réponse.Write(Server.HtmlEncode(key.Values(0)) & ", ")
Response.Write(Server.HtmlEncode(key.Values(1)) & "<br/>")
Suivant
End Sub
affiche les données de la table esclave dans un contrôle indépendant du formulaire, mais nous souhaitons parfois que le contrôle de table esclave soit imbriqué dans le contrôle de table maître et affiché dans le cadre de la table maître. . Pour réaliser cette fonction, vous devez inclure le contrôle de table esclave et les sources de données associées dans le modèle du contrôle de table principal, et disposer d'un paramètre de source de données pour obtenir la valeur du champ de la source de données de la table principale. Puisqu’il n’existe aucun objet paramètre déclaratif à associer à cette approche, vous devez définir la valeur du paramètre par programmation dans le code. Lorsque les éléments de données du contrôle de table principal sont liés, vous pouvez définir la valeur du paramètre dans un gestionnaire d'événements du contrôle de table principal (tel que l'événement DataBound de FormView). L'exemple suivant illustre cette technique.
<script runat="serveur">
Sous-formulaire protégé_DataBound (expéditeur ByVal en tant qu'objet, ByVal et système.EventArgs)
OrderDetailsDataSource.SelectParameters("OrderID").DefaultValue = FormView1.DataItem("OrderID")
Fin du sous-marin
</script>
<asp:FormView DataSourceID="OrdersDataSource"……>
<Modèle d'élément>
<b>ID de commande :</b>
<asp:Label ID="OrderIDLabel" runat="server" Text='<%# Eval("OrderID") %>'></asp:Label><br />
…
<asp:GridView DataSourceID="OrderDetailsDataSource" ……>
…
</asp:GridView>
</Modèle d'élément>
</asp:FormView>
<asp:SqlDataSource ConnectionString="<%$ ConnectionStrings:Northwind %>" ID="OrdersDataSource" runat="server" SelectCommand="SELECT [OrderID], [OrderDate], [ShipCity], [ShipCountry " ] DE [Commandes]" >
</asp:SqlDataSource>
<asp:SqlDataSource ConnectionString="<%$ ConnectionStrings:Northwind %>" ID="OrderDetailsDataSource" runat="server" SelectCommand="SELECT [Détails de la commande].OrderID, Products.ProductName, [Détails de la commande].UnitPrice, [Commande Détails].Quantité FROM [Détails de la commande] INNER JOIN Products ON [Détails de la commande].ProductID = Products.ProductID WHERE [Détails de la commande].OrderID = @OrderID">
<SélectionnerParamètres>
<asp:Nom du paramètre="ID de commande" />
</SélectionnerParamètres>
</asp:SqlDataSource>
L'exemple suivant illustre une technique similaire, qui utilise une DataList et gère l'événement ItemDataBound de la DataList pour définir la valeur du paramètre de source de données.
<script runat="serveur">
Sous-DataList1_ItemDataBound protégé (expéditeur ByVal en tant qu'objet, ByVal et en tant que System.Web.UI.WebControls.DataListItemEventArgs)
Dim s As SqlDataSource = e.Item.FindControl("OrderDetailsDataSource")
s.SelectParameters("OrderID").DefaultValue = e.Item.DataItem("OrderID")
Fin du sous-marin
</script>