, таким образом все будет готово для использования в коде.
Мы хотим выполнить соединение данных в обработчике событий
Page_Load
, так что элементы управления будут полностью заполнены,
когда мы захотим использовать их в других частях кода. Приступаем к считыванию данных из базы данных, независимо от того, выполняется ли в данный момент операция обратной отправки (даже если элементы управления списком будут сохранять свое содержимое с помощью viewstate), чтобы гарантировать, что мы имеем доступ ко всем данным, которые могут понадобиться, хотя нам и не нужно выполнять само соединение данных при обратной отправке. Это может показаться слегка расточительным, но читатель при желании может в качестве упражнения добавить дополнительную логику к коду для оптимизации такого поведения. Здесь мы сосредоточимся на том, как заставить все работать, не входя в практические детали.
foreach (System.Web.UI.WebControls.WebControl validator in this.Validators) {
validator.Enabled = false;
}
oleDbConnection1.Open;
if (!this.IsPostBack) {
calendar.SelectedDate = System.DateTime.Now;
}
OleDbConnection1.Close;
}
Мы вскоре увидим, почему задание данных календаря оставлено внутри этого кода проверки обратной отправки.
Для обмена данными нам необходимо использовать несколько объектов хранения данных. Мы можем объявить их на уровне класса, чтобы мы имели к ним доступ из других функций. Нам понадобится объект
DataSet
для хранения информации базы данных, три объекта
OleDb.OleDbDataAdapter
для выполнения запросов на множестве данных и объект
DataTable
хранения событий для последующего доступа. Они объявляются следующим образом:
new System.Data.OleDb.OleDbDataAdapter("SELECT * FROM Attendees", oleDbConnection1);
daRooms =
new System.Data.OleDb.OleDbDataAdapter("SELECT * FROM Rooms", oleDbConnection1);
daEvents =
new System.Data.OleDb.OleDbDataAdapter("SELECT * FROM Events", oleDbConnection1);
Затем
мы выполняем запросы с помощью вызовов
Fill
:
daEvents =
new System.Data.OleDb.OleDbDataAdapter("SELECT * FROM Events", oleDbConnection1);
daAttendees.Fill(ds, "Attendees");
daRooms.Fill(ds, "Rooms");
daEvents.Fill(ds, "Events");
Теперь переходим непосредственно к самому соединению данных. Как упоминалось ранее, это несложно и включает задание для свойства
DataSource
элементов управления соединением таблиц, с которыми мы хотим соединиться:
daEvent s.Fill(ds, "Events");
attendeeList.DataSource = ds.Tables["Attendees"];
roomList.DataSource = ds.Tables["Rooms"];
Этот код задает свойства, но само соединение данных не произойдет, пока не будет вызван метод формы
DataBind
, что мы сейчас и сделаем. Но прежде чем это сделать, заполним объект
DataTable
данными таблицы событий:
roomList.DataSource = ds.Tables["Rooms"];
eventTable = ds.Tables["Events"];
Будем соединять данные только в том случае, если нет обратной отправки, иначе происходит просто обновление данных (которые, по предположению, являются статическими в базе данных в течение выполнения запроса заказа события). Соединение данных при обратной отправке будет также стирать выбранные значения в элементах управления
roomList
и
attendeeList
. Мы могли бы сделать об этом замечание перед соединением, а затем обновить их, но проще вызвать
DataBind
в существующем операторе
if
(причина, почему этот оператор содержался в области кода, где открыто соединение с данными):
eventTable = ds.Tables["Events"];
if (!this.IsPostBack) {
calendar.SelectedDate = System.DateTime.Now;
this.DataBind;
}
oleDbConnection1.Close;
}
Теперь выполнение приложения приведет к доступности всех данных о помещениях и приглашенных гостях из элементов управления соединением данных.
Модификация элемента управления календарем
Прежде чем обсуждать добавление событий к базе данных, давайте сделаем модификацию в выводе изображения календаря. Было бы неплохо выводить любой день, где была сделана предварительная заявка, другим цветом, и сделать такие дни недоступными для выбора. Это потребует модификации способа, которым даты задаются в календаре, и способа, которым выводятся ячейки дней.
Начнем с выбора даты. Существует три момента, когда нам необходимо проверять даты заявок на мероприятия и изменять соответственно сделанный выбор: когда мы задаем начальную дату в
Page_Load
, когда пользователь пытается выбрать дату из календаря, и когда сделана заявка на мероприятие и мы хотим задать новую дату, чтобы помешать пользователю заказать подряд два мероприятия в один день до выбора новой даты. Так как это должно быть общим свойством, можно создать также скрытый метод для выполнения этого вычисления. Этот метод должен принимать пробную дату в качестве параметра и возвращать дату для использования, которая будет либо той же датой, что и пробная, или следующим доступным днем после пробной даты.