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
, когда пользователь пытается выбрать дату из календаря, и когда сделана заявка на мероприятие и мы хотим задать новую дату, чтобы помешать пользователю заказать подряд два мероприятия в один день до выбора новой даты. Так как это должно быть общим свойством, можно создать также скрытый метод для выполнения этого вычисления. Этот метод должен принимать пробную дату в качестве параметра и возвращать дату для использования, которая будет либо той же датой, что и пробная, или следующим доступным днем после пробной даты.
foreach (System.Data.DataRow testRow in eventTable.Rows) {
testDate = (System.DateTime)TestRow["EventDate"];
if (testDate.Date == trialDate.Date) {
trialDateOK = false;
trialDate = trialDate.AddDays(1);
}
}
}
}
return trialDate;
}
Этот простой код использует объект
eventTable
, который заполняется в
Page_Load
, для извлечения данных о мероприятии. Сначала мы проверяем тривиальный случай, где не заказано никаких мероприятий, в этом случае мы можем просто подтвердить пробную дату, возвращая ее. Затем мы просматриваем даты в таблице
Event
, сравнивая их с пробной датой. Если мы находим совпадение, то добавляем один день к пробной дате и снова выполняем поиск.
Извлечение даты из
DataTable
удивительно просто:
testDate = (System.DateTime)testRow["EventDate"];
Преобразование данных столбца в
System.DateTime
работает прекрасно.
Итак, прежде всего используем
getFreeDate
в
Page_Load
. Это просто означает внесение небольшого изменения в код, который задает свойство календаря
SelectedDate
:
if (!this.IsPostBack) {
System.DateTime trialDate = System.DateTime.Now;
calendar.SelectedDate = getFreeDate(trialDate);
this.DataBind;
}
Затем нам нужно ответить на выбор даты в календаре. Чтобы сделать это, просто добавим обработчик событий для события календаря
SelectionChanged
и выполним сравнение даты с датами существующих мероприятий: