在前面的文章中,我們已經知道如何將ControlParameter(控制項參數)與GridView的SelectedValue屬性相關聯以實作主-從資料表。 SelectedValue屬性傳回DataKeyNames屬性所指定的第一個欄位的值。你也可以為DataKeyNames屬性指定多個用逗號分隔的欄位值,例如,你可能需要把多個值傳遞到從表的資料來源。這些額外的鍵字段值是透過SelectedDataKey屬性暴露的,它返回一個DataKey對象,包含鍵字段的名稱/值對(pair)。透過在表達式中設定PropertyName屬性(例如SelectedDataKey.Values("title_id")),ControlParameter甚至於可以引用這些鍵。
<asp:ControlParameter Name="FirstKey" ControlID="MasterGrid" PropertyName="SelectedDataKey.Values[0]"/>
<asp:ControlParameter Name="SecondKey" ControlID="MasterGrid" PropertyName="SelectedDataKey.Values[1]"/>
下面的範例示範的程式碼列舉了DataKeys集合,並從GridView的SelectedDataKey中取得鍵字段的值:
Protected Sub 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 Field 1: </b>" & Server.HtmlEncode(GridView1.SelectedDataKey.Values("au_id")) & "<br />")
Response.Write("<b>DataKey Field 2: </b>" & Server.HtmlEncode(GridView1.SelectedDataKey.Values("title_id")) & "<br />")
End Sub
Protected Sub GridView1_DataBound(ByVal sender As Object, ByVal e As System.EventArgs)
Dim key As DataKey
Response.Write("<b>GridView DataKeys: </b><br />")
For Each key In GridView1.DataKeys
Response.Write(Server.HtmlEncode(key.Values(0)) & ", ")
Response.Write(Server.HtmlEncode(key.Values(1)) & "<br/>")
Next
End Sub
前面的主-從表示例把從表的資料顯示在窗體的一個獨立的控制項中,但是有時候我們希望從表格控制項是嵌套在主表控制項上,作為主表的一部分來顯示的。為了實現這種功能,你必須把從表格控制項和相關的資料來源都包含到主表控制項的範本中,並帶有一個資料來源參數,讓該參數從主表資料來源的欄位中取得值。由於使用這種方式的時候,沒有可供關聯的宣告式參數對象,你必須透過在程式碼中編程來設定參數值。當主表控制項的資料項目進行綁定的時候,你可以在主表控制項的某個事件處理(例如FormView的DataBound事件)中設定參數值。下面的例子演示了這種技巧。
<script runat="server">
Protected Sub FormView1_DataBound(ByVal sender As Object, ByVal e As System.EventArgs)
OrderDetailsDataSource.SelectParameters("OrderID").DefaultValue = FormView1.DataItem("OrderID")
End Sub
</script>
<asp:FormView DataSourceID="OrdersDataSource"…>
<ItemTemplate>
<b>OrderID:</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], [ShipCityCountity], [ShipCountry ] FROM [Orders]">
</asp:SqlDataSource>
<asp:SqlDataSource ConnectionString="<%$ ConnectionStrings:Northwind %>" ID="OrderDetailsDataSource" runat="server" SelectCommand="SELECT [Order Details].OrderID, Products.ProductName, [Order Details].UniderPrice, [OrductName, [Order Details].UniderPrice, [OrductName, [Order Details].UniderPrice, [OrductName, [Order Details].UniderPrice, [OrductName, [Order Details].UniderPrice, [OrductName, [Order Details]。 Details].Quantity FROM [Order Details] INNER JOIN Products ON [Order Details].ProductID = Products.ProductID WHERE [Order Details].OrderID = @OrderID">
<SelectParameters>
<asp:Parameter Name="OrderID" />
</SelectParameters>
</asp:SqlDataSource>
下面的範例示範了類似的技術,它使用的是DataList,處理DataList的ItemDataBound事件來設定資料來源參數值。
<script runat="server">
Protected Sub DataList1_ItemDataBound(ByVal sender 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")
End Sub
</script>