No artigo anterior já sabíamos como associar o ControlParameter (parâmetro de controle) à propriedade SelectedValue do GridView para implementar uma tabela de dados mestre-escravo. A propriedade SelectedValue retorna o valor do primeiro campo especificado pela propriedade DataKeyNames. Você também pode especificar vários valores de campo separados por vírgula para a propriedade DataKeyNames. Por exemplo, pode ser necessário passar vários valores da tabela para a fonte de dados. Esses valores de campo-chave adicionais são expostos por meio da propriedade SelectedDataKey, que retorna um objeto DataKey contendo o par nome/valor do campo-chave. ControlParameter pode até fazer referência a essas chaves definindo a propriedade PropertyName na expressão (por exemplo, SelectedDataKey.Values("title_id")).
<asp:ControlParameter Name="FirstKey" ControlID="MasterGrid" PropertyName="SelectedDataKey.Values[0]"/>
<asp:ControlParameter Name="SecondKey" ControlID="MasterGrid" PropertyName="SelectedDataKey.Values[1]"/>
O exemplo a seguir demonstra o código que enumera a coleção DataKeys e obtém o valor do campo-chave do SelectedDataKey do GridView:
Sub protegido GridView1_SelectedIndexChanged(ByVal sender As Object, ByVal e As 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 />")
Finalizar sub
Sub GridView1_DataBound protegido(ByVal remetente As Object, ByVal e As System.EventArgs)
Dim key como DataKey
Response.Write("<b>GridView DataKeys: </b><br />")
Para cada chave em GridView1.DataKeys
Response.Write(Server.HtmlEncode(key.Values(0)) & ", ")
Response.Write(Server.HtmlEncode(key.Values(1)) & "<br/>")
Próximo
End Sub
exibe os dados da tabela escrava em um controle independente do formulário, mas às vezes queremos que o controle da tabela escrava seja aninhado no controle da tabela mestre e exibido como parte da tabela mestre . Para realizar esta função, você deve incluir o controle da tabela escrava e as fontes de dados relacionadas no modelo do controle da tabela principal e ter um parâmetro de fonte de dados para obter o valor do campo da fonte de dados da tabela principal. Como não há nenhum objeto de parâmetro declarativo para associar a essa abordagem, você deve definir o valor do parâmetro programaticamente no código. Quando os itens de dados do controle da tabela principal são vinculados, você pode definir o valor do parâmetro em um manipulador de eventos do controle da tabela principal (como o evento DataBound do FormView). O exemplo a seguir demonstra essa técnica.
<script runat="servidor">
Sub FormView1_DataBound protegido(ByVal remetente As Object, ByVal e As System.EventArgs)
OrderDetailsDataSource.SelectParameters("OrderID").DefaultValue = FormView1.DataItem("OrderID")
Finalizar sub
</script>
<asp:FormView DataSourceID="OrdersDataSource"……>
<ItemTemplate>
<b>ID do pedido:</b>
<asp:Label ID="OrderIDLabel" runat="server" Text='<%# Eval("OrderID") %>'></asp:Label><br />
…
<asp:GridView DataSourceID="OrderDetailsDataSource" ……>
…
</asp:GridView>
</ItemTemplate>
</asp:FormView>
<asp:SqlDataSource ConnectionString="<%$ ConnectionStrings:Northwind %>" ID="OrdersDataSource" runat="server" SelectCommand="SELECT [OrderID], [OrderDate], [ShipCity], [ShipCountry "] DE [Pedidos]">
</asp:SqlDataSource>
<asp:SqlDataSource ConnectionString="<%$ ConnectionStrings:Northwind %>" ID="OrderDetailsDataSource" runat="server" SelectCommand="SELECT [Detalhes do pedido].OrderID, Products.ProductName, [Detalhes do pedido].UnitPrice, [Pedido Detalhes].Quantidade FROM [Detalhes do pedido] INNER JOIN Produtos EM [Detalhes do pedido].ProductID = Produtos.ProductID WHERE [Detalhes do pedido].OrderID = @OrderID">
<Selecionar Parâmetros>
<asp:Nome do Parâmetro="OrderID" />
</Selecionar Parâmetros>
</asp:SqlDataSource>
O exemplo a seguir demonstra uma técnica semelhante, que usa um DataList e manipula o evento ItemDataBound do DataList para definir o valor do parâmetro da fonte de dados.
<script runat="servidor">
Sub DataList1_ItemDataBound protegido(ByVal remetente As Object, ByVal e As System.Web.UI.WebControls.DataListItemEventArgs)
Dim s As SqlDataSource = e.Item.FindControl("OrderDetailsDataSource")
s.SelectParameters("OrderID").DefaultValue = e.Item.DataItem("OrderID")
Finalizar sub
</roteiro>