Практическое руководство. Обращение к членам контейнера имен серверного веб-элемента управления
Обновлен: Ноябрь 2007
Иногда может возникнуть необходимость обратиться к свойствам или методам контейнера имен элемента управления. Например, при выполнении привязки данных контейнер имен позволяет обратиться к свойству DataItem, содержащему данные, к которым привязаны элементы управления. Можно обратиться к элементу управления, содержащему данные, по-разному в зависимости от контекста.
Обращение к контейнеру имен из выражения привязки данных
В выражении привязки данных используйте ключевое слово Container, возвращающее ссылку на контейнер. Затем можно обратиться к свойствам или методам контейнера.
Чаще всего это ключевое слово используется в методе Eval для получения значений из объекта DataItem контейнера имен, но оно также применяется и за пределами этого метода. В следующем примере иллюстрируется использование элемента управления Label, который может находиться в шаблоне для элемента управления DataList, Repeater или GridView. Он отображает номер текущего элемента и текущий элемент данных Title контейнера имен.
<asp:Label ID="Label1" runat="server"> <%# Container.DataItemIndex + 1 %>. <%# Eval("Title") %> </asp:Label>
<asp:Label ID="Label1" runat="server"> <%# Container.DataItemIndex + 1 %>. <%# Eval("Title") %> </asp:Label>
Далее приводится аналогичный пример, но в нем значение (элемент Author) возвращается от объекта DataItem контейнера имен:
<asp:Label ID="Label2" runat="server" > <%# DataBinder.Eval(Container.DataItem, "Author") %> </asp:Label>
<asp:Label ID="Label2" runat="server" > <%# DataBinder.Eval(Container.DataItem, "Author") %> </asp:Label>
Примечание. Свойство NamingContainer не обязательно обращается к тому же элементу управления, что и свойство Parent. Например, в элементе управления Repeater может использоваться шаблон элемента, содержащий таблицу, которая, в свою очередь, содержит элемент управления Label. Родительский элемент управления метки — это ячейка таблицы (например, объект HtmlTableCell), но ее контейнером имен является объект DataListItem, поскольку пространство имен для элемента управления Label определяет не таблица, а элемент DataListItem.
Далее приведен полный пример, в котором описанный выше синтаксис используется для возврата значений свойств.
<%@ Page Language="VB" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>Naming Container Example</title> </head> <body> <form id="form1" runat="server"> <div> <asp:XmlDataSource ID="XmlDataSource1" runat="server" XPath="Books/LanguageBooks/Book"> <Data> <Books> <LanguageBooks> <Book Title="Pure JavaScript" Author="Wyke, Gilliam, and Ting"/> <Book Title="Effective C++ Second Edition" Author="Scott Meyers"/> <Book Title="Assembly Language Step-By-Step" Author="Jeff Duntemann"/> <Book Title="Oracle PL/SQL" Author="Steven Feuerstein"/> </LanguageBooks> <SecurityBooks> <Book Title="Counter Hack" Author="Ed Skoudis"/> </SecurityBooks> </Books> </Data> </asp:XmlDataSource> <asp:GridView ID="GridView1" runat="server" DataSourceID="XmlDataSource1" AutoGenerateColumns="False"> <Columns> <asp:TemplateField HeaderText="Title" > <ItemTemplate> <asp:Label ID="Label1" runat="server"> <%# Container.DataItemIndex + 1 %>. <%# Eval("Title") %> </asp:Label> </ItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="Author"> <ItemTemplate> <asp:Label ID="Label2" runat="server" > <%# DataBinder.Eval(Container.DataItem, "Author") %> </asp:Label> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView> </div> </form> </body> </html>
<%@ Page Language="C#" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>Naming Container Example</title> </head> <body> <form id="form1" runat="server"> <div> <asp:XmlDataSource ID="XmlDataSource1" runat="server" XPath="Books/LanguageBooks/Book"> <Data> <Books> <LanguageBooks> <Book Title="Pure JavaScript" Author="Wyke, Gilliam, and Ting"/> <Book Title="Effective C++ Second Edition" Author="Scott Meyers"/> <Book Title="Assembly Language Step-By-Step" Author="Jeff Duntemann"/> <Book Title="Oracle PL/SQL" Author="Steven Feuerstein"/> </LanguageBooks> <SecurityBooks> <Book Title="Counter Hack" Author="Ed Skoudis"/> </SecurityBooks> </Books> </Data> </asp:XmlDataSource> <asp:GridView ID="GridView1" runat="server" DataSourceID="XmlDataSource1" AutoGenerateColumns="False"> <Columns> <asp:TemplateField HeaderText="Title" > <ItemTemplate> <asp:Label ID="Label1" runat="server"> <%# Container.DataItemIndex + 1 %>. <%# Eval("Title") %> </asp:Label> </ItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="Author"> <ItemTemplate> <asp:Label ID="Label2" runat="server" > <%# DataBinder.Eval(Container.DataItem, "Author") %> </asp:Label> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView> </div> </form> </body> </html>
Обращение к контейнеру имен из кода
Получите свойство NamingContainer элемента управления и приведите его к типу класса контейнера, например, GridViewRow.
Пример см. в разделе Использование свойства NamingContainer для определения контейнера именования элемента управления.
См. также
Основные понятия
Идентификация элементов управления Web Forms
Ссылки
Синтаксис выражений привязки данных
Другие ресурсы
Доступ к элементам управления ASP.NET программными средствами