前回の記事では、ControlParameter (コントロール パラメーター) を GridView の SelectedValue プロパティに関連付けてマスター/スレーブ データ テーブルを実装する方法をすでに説明しました。 SelectedValue プロパティは、DataKeyNames プロパティで指定された最初のフィールドの値を返します。たとえば、DataKeyNames プロパティに複数のカンマ区切りフィールド値を指定することもでき、テーブルからデータ ソースに複数の値を渡す必要がある場合があります。これらの追加のキー フィールド値は、キー フィールドの名前と値のペアを含む DataKey オブジェクトを返す SelectedDataKey プロパティを通じて公開されます。 ControlParameter は、式で PropertyName プロパティを設定することによって、これらのキーを参照することもできます (たとえば、SelectedDataKey.Values("title_id"))。
<asp:ControlParameter Name="FirstKey" ControlID="MasterGrid" PropertyName="SelectedDataKey.Values[0]"/>
<asp:ControlParameter Name="SecondKey" ControlID="MasterGrid" PropertyName="SelectedDataKey.Values[1]"/>
次の例は、DataKeys コレクションを列挙し、DataKeys コレクションの SelectedDataKey からキー フィールドの値を取得するコードを示しています
。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 フィールド 1: </b>" & Server.HtmlEncode(GridView1.SelectedDataKey.Values("au_id")) & "<br />")
Response.Write("<b>DataKey フィールド 2: </b>" & Server.HtmlEncode(GridView1.SelectedDataKey.Values("title_id")) & "<br />")
エンドサブ
Protected Sub GridView1_DataBound(ByVal sender As Object、ByVal e As System.EventArgs)
ディムキーをDataKeyとして
Response.Write("<b>GridView DataKeys: </b><br />")
GridView1.DataKeys の各キーについて
Response.Write(Server.HtmlEncode(key.Values(0)) & ", ")
Response.Write(Server.HtmlEncode(key.Values(1)) & "<br/>")
次
End Sub
、フォームの独立したコントロールにスレーブ テーブルのデータが表示されますが、場合によっては、スレーブ テーブル コントロールをマスター テーブル コントロールにネストして、マスター テーブルの一部として表示したい場合があります。 。この機能を実現するには、スレーブ テーブル コントロールと関連データ ソースをメイン テーブル コントロールのテンプレートに含める必要があり、メイン テーブル データ ソースのフィールドから値を取得するデータ ソース パラメーターが必要です。このアプローチに関連付ける宣言的なパラメーター オブジェクトがないため、コード内でプログラム的にパラメーター値を設定する必要があります。メイン テーブル コントロールのデータ項目がバインドされている場合、メイン テーブル コントロールのイベント ハンドラー (FormView の DataBound イベントなど) でパラメーター値を設定できます。次の例は、この手法を示しています。
<スクリプト runat="サーバー">
Protected Sub FormView1_DataBound(ByVal sender As Object、ByVal e As System.EventArgs)
OrderDetailsDataSource.SelectParameters("注文ID").DefaultValue = FormView1.DataItem("注文ID")
エンドサブ
</script>
<asp:FormView DataSourceID="OrdersDataSource"……>
<アイテムテンプレート>
<b>注文ID:</b>
<asp:Label ID="OrderIDLabel" runat="server" Text='<%# Eval("OrderID") %>'></asp:Label><br />
…
<asp:GridView DataSourceID="OrderDetailsDataSource" ……>
…
</asp:GridView>
</アイテムテンプレート>
</asp:FormView>
<asp:SqlDataSource ConnectionString="<%$ ConnectionStrings:Northwind %>" ID="OrdersDataSource" runat="server" SelectCommand="SELECT [OrderID], [OrderDate], [ShipCity], [Shipcountry] " ] FROM [注文]">
</asp:SqlDataSource>
<asp:SqlDataSource ConnectionString="<%$ ConnectionStrings:Northwind %>" ID="OrderDetailsDataSource" runat="server" SelectCommand="SELECT [注文詳細].OrderID, Products.ProductName, [注文詳細].UnitPrice, [Order詳細].数量 FROM [注文詳細] INNER JOIN 製品 ON [注文詳細].ProductID = Products.ProductID WHERE [注文詳細].OrderID = @OrderID">
<パラメータの選択>
<asp:パラメータ名="注文ID" />
</パラメータの選択>
</asp:SqlDataSource>
次の例は、DataList を使用し、DataList の ItemsDataBound イベントを処理してデータ ソース パラメーター値を設定する同様の手法を示しています。
<スクリプト runat="サーバー">
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("注文ID").DefaultValue = e.Item.DataItem("注文ID")
エンドサブ
</スクリプト>