En el artículo anterior ya sabíamos cómo asociar el ControlParameter (parámetro de control) con la propiedad SelectedValue del GridView para implementar una tabla de datos maestro-esclavo. La propiedad SelectedValue devuelve el valor del primer campo especificado por la propiedad DataKeyNames. También puede especificar varios valores de campo separados por comas para la propiedad DataKeyNames. Por ejemplo, es posible que deba pasar varios valores a la fuente de datos desde la tabla. Estos valores de campo clave adicionales se exponen a través de la propiedad SelectedDataKey, que devuelve un objeto DataKey que contiene el par nombre/valor del campo clave. ControlParameter puede incluso hacer referencia a estas claves estableciendo la propiedad PropertyName en la expresión (por ejemplo, SelectedDataKey.Values("title_id")).
<asp:ControlParameter Name="FirstKey" ControlID="MasterGrid" PropertyName="SelectedDataKey.Values[0]"/>
<asp:ControlParameter Name="SecondKey" ControlID="MasterGrid" PropertyName="SelectedDataKey.Values[1]"/>
El siguiente ejemplo demuestra el código que enumera la colección DataKeys y obtiene el valor del campo clave de SelectedDataKey del GridView:
Sub GridView1_SelectedIndexChanged protegido (remitente ByVal como objeto, ByVal y como System.EventArgs)
Response.Write("<b>SelectedDataKey.Value: </b>" & Server.HtmlEncode(GridView1.SelectedDataKey.Value) & "<br />")
Response.Write("<b>DataKey Campo 1: </b>" & Server.HtmlEncode(GridView1.SelectedDataKey.Values("au_id")) & "<br />")
Response.Write("<b>DataKey Campo 2: </b>" & Server.HtmlEncode(GridView1.SelectedDataKey.Values("title_id")) & "<br />")
Subtítulo final
Sub GridView1_DataBound protegido (remitente ByVal como objeto, ByVal y como System.EventArgs)
Tecla atenuada como clave de datos
Response.Write("<b>GridView DataKeys: </b><br />")
Para cada clave en GridView1.DataKeys
Respuesta.Write(Server.HtmlEncode(key.Values(0)) & ", ")
Response.Write(Server.HtmlEncode(key.Values(1)) & "<br/>")
Próximo
End Sub
muestra los datos de la tabla esclava en un control independiente del formulario, pero a veces queremos que el control de la tabla esclava esté anidado en el control de la tabla maestra y se muestre como parte de la tabla maestra. . Para lograr esta función, debe incluir el control de la tabla esclava y las fuentes de datos relacionadas en la plantilla del control de la tabla principal, y tener un parámetro de fuente de datos para obtener el valor del campo de la fuente de datos de la tabla principal. Dado que no hay ningún objeto de parámetro declarativo para asociar con este enfoque, debe establecer el valor del parámetro mediante programación en el código. Cuando los elementos de datos del control de la tabla principal están vinculados, puede establecer el valor del parámetro en un controlador de eventos del control de la tabla principal (como el evento DataBound de FormView). El siguiente ejemplo demuestra esta técnica.
<script runat="servidor">
Sub protegido FormView1_DataBound (remitente ByVal como objeto, ByVal y como System.EventArgs)
OrderDetailsDataSource.SelectParameters("OrderID").DefaultValue = FormView1.DataItem("OrderID")
Subtítulo final
</script>
<asp:FormView DataSourceID="OrdersDataSource"……>
<Plantilla de artículo>
<b>ID de pedido:</b>
<asp:Label ID="OrderIDLabel" runat="servidor" Text='<%# Eval("OrderID") %>'></asp:Label><br />
…
<asp:GridView DataSourceID="OrderDetailsDataSource" ……>
…
</asp:GridView>
</Plantilla de elemento>
</asp:FormView>
<asp:SqlDataSource ConnectionString="<%$ ConnectionStrings:Northwind %>" ID="OrdersDataSource" runat="servidor" SelectCommand="SELECT [ID de pedido], [Fecha de pedido], [Ciudad de envío], [País de envío " ] DE [Pedidos]">
</asp:SqlDataSource>
<asp:SqlDataSource ConnectionString="<%$ ConnectionStrings:Northwind %>" ID="OrderDetailsDataSource" runat="servidor" SelectCommand="SELECT [Detalles del pedido].ID del pedido, Productos.Nombre del producto, [Detalles del pedido].Precio unitario, [Pedido Detalles].Cantidad DESDE [Detalles del pedido] INNER JOIN Productos EN [Detalles del pedido].IDProducto = Productos.IDProducto DONDE [Detalles del pedido].IDOrder = @IDOrder">
<Seleccionar parámetros>
<asp:Nombre del parámetro="ID de pedido" />
</Seleccionar parámetros>
</asp:SqlDataSource>
El siguiente ejemplo demuestra una técnica similar, que utiliza una lista de datos y maneja el evento ItemDataBound de la lista de datos para establecer el valor del parámetro de la fuente de datos.
<script runat="servidor">
Sub DataList1_ItemDataBound protegido (remitente ByVal como objeto, ByVal y como System.Web.UI.WebControls.DataListItemEventArgs)
Dim s As SqlDataSource = e.Item.FindControl("OrderDetailsDataSource")
s.SelectParameters("OrderID").DefaultValue = e.Item.DataItem("OrderID")
Subtítulo final
</guión>