Привязка к данным
Некоторые элементы управления: списки, таблицы и другие — имеют свойство DataSource, которое отвечает за привязку к данным. Тип этого свойства — object, то есть он может быть любым, но должен реализовывать интерфейс IEnumerable. Часто значениями этого свойства назначают коллекции. В таком случае нет нужды добавлять значения вручную. Свойство DataSource может быть привязано к коллекциям, поддерживающим интерфейсы IEnumerable, ICollection или IListSource. Источником данных также могут быть XML-файлы, базы данных. Вызовом метода DataBind данные привязываются к элементу управления. Метод Page.DataBind вызывает привязку данных у всех элементов на странице.
Приведенный ниже выпадающий список помогает выбрать континент для путешествия. Источник данных — динамический массив ArrayList. Используйте его, если в программе происходит много вставок и удалений:
void Page_Load() { ArrayList ContinentArrayList = new ArrayList(); ContinentArrayList.Add("Worldwide"); ContinentArrayList.Add("America"); ContinentArrayList.Add("Africa"); ContinentArrayList.Insert(1, "Asia-Pacific"); ContinentDropDownList.DataSource = ContinentArrayList; ContinentDropDownList.DataBind(); } //End Page_Load() .... <asp:DropDownList id="ContinentDropDownList" runat="server" />
Можно использовать в качестве источника данных хэш-таблицы (Hashtable). Хэш-таблицы — это структуры данных, которые были придуманы давно (см. том 3 "Искусства программирования" Д.
Кнута), но программисты долгое время были вынуждены реализовывать их вручную. В языке PHP обычный массив и есть хэш-таблица. В библиотеке STL для языка С++ тоже есть тип map, в котором данные хранятся таким способом. Хэш-таблицы позволяют очень быстро найти значение по ключу. Индекс в коллекции вычисляется как простая хэш-функция ключа. В C# ключи используются как индексаторы. Используйте Hashtable, если в программе часто осуществляется поиск. Вставка и удаление происходят в нем медленно. Ключи могут быть произвольного типа. В классе Object определен виртуальный метод GetHashCode, он и применяется в Hashtable:
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script runat="server"> void calSelectChange(Object sender, EventArgs e) { lblShow.Visible = false; Hashtable hshDays = new Hashtable(); hshDays[Convert.ToDateTime("2/6/2006")] = "Экзамен по алгеб- ре"; hshDays[Convert.ToDateTime("3/6/2006")] = "Экзамен по С#"; hshDays[Convert.ToDateTime("4/6/2006")] = "Начало изучения курса ASP.NET"; hshDays[Convert.ToDateTime("1/6/2006")] = "День защиты де- тей"; DateTime datDateIn; datDateIn = calDays.SelectedDate; if (Page.IsPostBack) { lblShow.Text = "На этот день назначен: "; lblShow.Text += hshDays[datDateIn]; if (hshDays[datDateIn] == null) lblShow.Text = "Ничего не назначено"; lblShow.Visible = true; } } </script>
<html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>Попробуем хэш-таблицу</title> </head> <body> <form id="form1" runat="server"> <div> <h3>Ежедневник </h3> Введите дату между 1/6/2006 и 30/6/2006 <asp:Calendar id="calDays" runat="server" OnSelectionChanged="calSelectChange" VisibleDate="06/06/2006" ></asp:Calendar> <br /> <br /> <asp:Label id="lblShow" runat="server"></asp:Label> </div> </form> </body> </html>
Здесь ключом хэш-таблицы является дата. Convert.ToDateTime конвертирует строку в тип даты. VisibleDate гарантирует, что на календаре будет июнь 2006 года. Если значений по ключу в таблице нет, то индексатор просто возвращает null. Значения можно вводить в любом порядке.
Хотелось бы добавить в страницу новую возможность введения новых записей. Можно ввести новые элементы управления — строку ввода и кнопку для подачи данных. При обработке нажатия на кнопку добавим в хэш-таблицу новое значение:
void Button1_Click(object sender, EventArgs e) { hshDays[calDays.SelectedDate]=TextBox1.Text; }
Эта страница не работает. Дело в том, что страница загружается заново, когда меняется дата. Хэш-таблица создается заново, и введенные в нее значения теряются. Как же решить эту проблему? Сделаем хэш-таблицу статической переменной:
static Hashtable hshDays; void calSelectChange(Object sender, EventArgs e) { DateTime datDateIn = calDays.SelectedDate;
lblShow.Text = " На этот день назначен: "; lblShow.Text += hshDays[datDateIn]; if (hshDays[datDateIn] == "") lblShow.Text = "Ничего не назначено"; } void Page_Init() { if (!Page.IsPostBack) { hshDays=new Hashtable(); hshDays[Convert.ToDateTime("2/6/2006")] = "Экзамен по ал- гебре"; hshDays[Convert.ToDateTime("3/6/2006")] = "Экзамен по С#"; hshDays[Convert.ToDateTime("4/6/2006")] = "Начало изуче- ния курса ASP.NET"; hshDays[Convert.ToDateTime("1/6/2006")] = "День защиты детей"; Session["Diary"]= hshDays; } }
void Record(Object sender, EventArgs e) { DateTime datDateIn = calDays.SelectedDate; hshDays[datDateIn]= Entrance.Text; lblShow.Text = hshDays[datDateIn].ToString(); }