В предыдущей статье мы уже знали, как связать ControlParameter (параметр управления) со свойством SelectedValue GridView для реализации таблицы данных «главный-подчиненный». Свойство SelectedValue возвращает значение первого поля, указанного свойством DataKeyNames. Вы также можете указать несколько значений полей, разделенных запятыми, для свойства DataKeyNames. Например, вам может потребоваться передать в источник данных несколько значений из таблицы. Эти дополнительные значения ключевого поля предоставляются через свойство SelectedDataKey, которое возвращает объект DataKey, содержащий пару имя/значение ключевого поля. 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 и получает значение ключевого поля из SelectedDataKey объекта GridView:
Protected Sub GridView1_SelectedIndexChanged (отправитель ByVal как объект, 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 />")
Конец субтитра
Защищенный Sub GridView1_DataBound (отправитель ByVal как объект, 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
отображает данные из подчиненной таблицы в независимом элементе управления формы, но иногда нам нужно, чтобы элемент управления «ведомая таблица» был вложен в элемент управления «главная таблица» и отображался как часть главной таблицы. . Чтобы реализовать эту функцию, необходимо включить элемент управления подчиненной таблицы и связанные источники данных в шаблон элемента управления основной таблицы и иметь параметр источника данных для получения значения из поля источника данных основной таблицы. Поскольку при таком подходе не существует декларативного объекта параметра, который можно было бы связать, значение параметра необходимо задать программно в коде. Когда элементы данных основного элемента управления таблицей привязаны, вы можете установить значение параметра в обработчике событий основного элемента управления таблицей (например, в событии DataBound FormView). Следующий пример демонстрирует этот метод.
<скрипт runat="сервер">
Защищенная подпрограмма FormView1_DataBound (отправитель ByVal как объект, ByVal e As System.EventArgs)
OrderDetailsDataSource.SelectParameters("OrderID").DefaultValue = FormView1.DataItem("OrderID")
Конец субтитра
</script>
<asp:FormView DataSourceID="OrdersDataSource"……>
<Шаблон предмета>
<b>Идентификатор заказа:</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 " ] ОТ [Заказы]">
</asp:SqlDataSource>
<asp:SqlDataSource ConnectionString="<%$ ConnectionStrings:Northwind %>" ID="OrderDetailsDataSource" runat="server" SelectCommand="SELECT [Детали заказа].OrderID, Products.ProductName, [Детали заказа].UnitPrice, [Заказ Подробности].Количество ИЗ [Детали заказа] INNER JOIN Продукты НА [Детали заказа].ProductID = Products.ProductID ГДЕ [Детали заказа].OrderID = @OrderID">
<Выбрать параметры>
<asp:Parameter Name="OrderID" />
</Выбрать параметры>
</asp:SqlDataSource>
В следующем примере демонстрируется аналогичный метод, в котором используется DataList и обрабатывается событие ItemDataBound DataList для установки значения параметра источника данных.
<скрипт runat="сервер">
Protected Sub DataList1_ItemDataBound (отправитель ByVal как объект, ByVal e As System.Web.UI.WebControls.DataListItemEventArgs)
Dim s As SqlDataSource = e.Item.FindControl("OrderDetailsDataSource")
s.SelectParameters("OrderID").DefaultValue = e.Item.DataItem("OrderID")
Конец субтитра
</скрипт>