Привязка данных ADO.NET
Привязка множественного значения к списковым элементам управления
Некоторые элементы управления библиотеки .NET Framework, служащие для отображения данных, позволяют привязать сразу несколько своих дочерних элементов к источнику данных. К ним относятся прежде всего списковые элементы управления:
- Все списковые элементы управления, которые генерируют свой HTML-код с использованием дескриптора <select>, включая HtmlSelect, ListBox и DropDownList
- Элементы управления CheckBoxList и RadioButtonList, генерирующие HTML-код своих дочерних элементов в виде флажков или переключателей
- Элемент управления BulletedList, создающий нумерованный или маркированный список
Все они наследуют от System.Web.UI.WebControls.ListControl, который содержит свойства, необходимые для привязки множественного значения. Эти свойства приведены в таблице
В свою очередь, класс ListControl наследует метод DataBind() от класса System.Web.UI.WebControls.BaseDataBoundControl, иницирующий привязку.
Для примера привязки множественного значения спроектируем страницу, в которой в качестве объекта, имитирующего источник данных, используем класс Hashtable (hash - мусор). Он реализует интерфейс System.Collections.Generic.IDictionary, имеющий шаблонный метод IDictionary<TKey, TValue>.Add(TKey, TValue).
- Добавьте к приложению страницу с неразделяемым кодом и именем RepeatedValueBinding.aspx
- Заполните интерфейсную часть страницы следующим кодом
<%@ Page Language="C#" %> <script runat="server"> </script> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <div> <select runat="server" id="Select1" datatextfield="Key" datavaluefield="Value" size="3" /> <select runat="server" id="Select2" datatextfield="Key" datavaluefield="Value" /> <asp:ListBox runat="server" ID="ListBox1" DataTextField="Key" DataValueField="Value" Rows="3" /> <asp:DropDownList runat="server" ID="DropDownList1" DataTextField="Key" DataValueField="Value" /> <asp:RadioButtonList runat="server" ID="RadioButtonList1" DataTextField="Key" DataValueField="Value" /> <asp:CheckBoxList runat="server" ID="CheckBoxList1" DataTextField="Key" DataValueField="Value" /> <br /> <asp:Button runat="server" ID="GetSelection" Text="Получить выделенное" /> <br /> <br /> <asp:Literal runat="server" ID="Result" EnableViewState="false" /> </div> </form> </body> </html>
Объявления первых двух статических списков нужно набирать вручную, чтобы подсказчик кода допускал к их атрибутам. Элемент управления Literal все-равно будет заполняться при каждой обратной отсылке и отображать значения свойств выбранных дочерних элементов. Поэтому, чтобы не таскать состояние этого элемента с сервера на броузер и обратно, отключим у него свойство сохранения состояния.
- Переведите редактор страницы в режим Design и двойным щелчком мыши на свободном месте создайте обработчик Page_Load(), который заполните так
protected void Page_Load(object sender, EventArgs e) { if (!this.IsPostBack) { // Создать источник данных (коллекцию) с тремя элементами Hashtable ht = new Hashtable(3); // Добавить в коллекцию элементы по схеме: Add(Key, Value) ht.Add("Иванов", "Value1"); ht.Add("Петров", "Value2"); ht.Add("Сидоров", "Value3"); // Связать элементы управления с источником данных Select1.DataSource = ht; Select2.DataSource = ht; ListBox1.DataSource = ht; DropDownList1.DataSource = ht; RadioButtonList1.DataSource = ht; CheckBoxList1.DataSource = ht; // Загрузить данные в элементы управления this.DataBind(); } }
Источник данных Hashtable можно представить таблицей из двух столбцов. Первый столбец считается Key, второй - Value.
- Запустите страницу, чтобы проверить работу механизма привязки множественного значения к списковым элементам управления
Теперь реализуем функциональность, чтобы при щелчке на кнопке элемент Literal собирал и отображал информацию о выделенных элементах списков.
- Создайте обработчик для кнопки Button и заполните его следующим кодом
protected void GetSelection_Click(object sender, EventArgs e) { try { Result.Text += "<li>В Select1 выбрано: " + "(\"" + Select1.Items[Select1.SelectedIndex].Text // Key + "\", \"" + Select1.Value + "\")"; // Value Result.Text += "<li>В Select2 выбрано: " + "(\"" + Select2.Items[Select2.SelectedIndex].Text // Key + "\", \"" + Select2.Value + "\")"; // Value Result.Text += "<li>В ListBox1 выбрано: " + "(\"" + ListBox1.SelectedItem.Text // Key + "\", \"" + ListBox1.SelectedItem.Value + "\")"; // Value Result.Text += "<li>В DropDownList1 выбрано: " + "(\"" + DropDownList1.SelectedItem.Text // Key + "\", \"" + DropDownList1.SelectedItem.Value + "\")"; // Value Result.Text += "<li>В RadioButtonList1 выбрано: " + "(\"" + RadioButtonList1.SelectedItem.Text // Key + "\", \"" + RadioButtonList1.SelectedItem.Value + "\")";// Value // Проверяем флажки int checkedCount = 0; string checkString = ""; foreach (ListItem check in CheckBoxList1.Items) { if (check.Selected) { checkString += "(\"" + check.Text // Key + "\", \"" + check.Value + "\"); "; // Value checkedCount++; // Считем выделенные флажки } } if (checkedCount == 0) Result.Text += "<li>В CheckBoxList1 ничего не выбрано!"; else Result.Text += "<li>В CheckBoxList1 выбрано: " + checkString; } catch { Result.Text = "<h1 style='color:Red'>Выберите в каждом элементе</h1>"; } }
Разница в коде доступа к свойствам списков между серверными элементами управления и статическими объясняется подгонкой фирмой Microsoft HTML-классов под ранее разработанные дескрипторы <select>.
- Выполните полностью готовую страницу, демонстрирующую работу механизма привязки множественного значения к списковым элементам управления, чтобы получить следующий результат