Im vorherigen Artikel wussten wir bereits, wie man den ControlParameter (Steuerparameter) mit der SelectedValue-Eigenschaft der GridView verknüpft, um eine Master-Slave-Datentabelle zu implementieren. Die SelectedValue-Eigenschaft gibt den Wert des ersten Feldes zurück, das durch die DataKeyNames-Eigenschaft angegeben wird. Sie können auch mehrere durch Kommas getrennte Feldwerte für die DataKeyNames-Eigenschaft angeben. Beispielsweise müssen Sie möglicherweise mehrere Werte aus der Tabelle an die Datenquelle übergeben. Diese zusätzlichen Schlüsselfeldwerte werden über die SelectedDataKey-Eigenschaft verfügbar gemacht, die ein DataKey-Objekt zurückgibt, das das Name/Wert-Paar des Schlüsselfelds enthält. ControlParameter kann sogar auf diese Schlüssel verweisen, indem die PropertyName-Eigenschaft im Ausdruck festgelegt wird (z. B. SelectedDataKey.Values("title_id")).
<asp:ControlParameter Name="FirstKey" ControlID="MasterGrid" PropertyName="SelectedDataKey.Values[0]"/>
<asp:ControlParameter Name="SecondKey" ControlID="MasterGrid" PropertyName="SelectedDataKey.Values[1]"/>
Das folgende Beispiel zeigt den Code, der die DataKeys-Auflistung auflistet und den Wert des Schlüsselfelds aus dem SelectedDataKey des abruft GridView:
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 />")
Sub beenden
Protected Sub GridView1_DataBound(ByVal sender As Object, ByVal e As System.EventArgs)
Dimmtaste als DataKey
Response.Write("<b>GridView DataKeys: </b><br />")
Für jeden Schlüssel in GridView1.DataKeys
Response.Write(Server.HtmlEncode(key.Values(0)) & ", ")
Response.Write(Server.HtmlEncode(key.Values(1)) & "<br/>")
Nächste
End Sub
zeigt die Daten aus der Slave-Tabelle in einem unabhängigen Steuerelement des Formulars an. Manchmal möchten wir jedoch, dass das Slave-Tabellensteuerelement im Master-Tabellensteuerelement verschachtelt und als Teil der Master-Tabelle angezeigt wird . . Um diese Funktion zu erreichen, müssen Sie das Slave-Tabellensteuerelement und zugehörige Datenquellen in die Vorlage des Haupttabellensteuerelements einbinden und über einen Datenquellenparameter verfügen, um den Wert aus dem Feld der Haupttabellendatenquelle abzurufen. Da diesem Ansatz kein deklaratives Parameterobjekt zugeordnet werden kann, müssen Sie den Parameterwert programmgesteuert im Code festlegen. Wenn die Datenelemente des Haupttabellensteuerelements gebunden sind, können Sie den Parameterwert in einem Ereignishandler des Haupttabellensteuerelements festlegen (z. B. das DataBound-Ereignis von FormView). Das folgende Beispiel demonstriert diese Technik.
<script runat="server">
Protected Sub FormView1_DataBound(ByVal sender As Object, ByVal e As System.EventArgs)
OrderDetailsDataSource.SelectParameters("OrderID").DefaultValue = FormView1.DataItem("OrderID")
Sub beenden
</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], [ShipCity], [ShipCountry „ ] AUS [Bestellungen]“>
</asp:SqlDataSource>
<asp:SqlDataSource ConnectionString="<%$ ConnectionStrings:Northwind %>" ID="OrderDetailsDataSource" runat="server" SelectCommand="SELECT [Bestelldetails].OrderID, Products.ProductName, [Bestelldetails].UnitPrice, [Bestellung Details].Quantity FROM [Bestelldetails] INNER JOIN Products ON [Bestelldetails].ProductID = Products.ProductID WHERE [Bestelldetails].OrderID = @OrderID">
<Parameter auswählen>
<asp:Parameter Name="OrderID" />
</SelectParameters>
</asp:SqlDataSource>
Das folgende Beispiel demonstriert eine ähnliche Technik, die eine DataList verwendet und das ItemDataBound-Ereignis der DataList verarbeitet, um den Datenquellenparameterwert festzulegen.
<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")
Sub beenden
</script>