Чтение онлайн

ЖАНРЫ

C# для профессионалов. Том II

Ватсон Карли

Шрифт:

public class WebForm1 : System.Web.UI.Page {

 ...

 protected System.Data.DataSet ds;

 protected System.Data.DataTable eventTable;

 protected System.DataOleDb.OleDbDataAdapter daAttendees;

 protected System.DataOleDb.OleDbDataAdapter daRooms;

 protected System.Data.OleDb.OleDbDataAdapter daEvents;

Существуют версии SQL Server всех объектов OLE DB, и их использование идентично.

Теперь для

Page_Load
надо создать объект
DataSet
:

private void Page_Load(object sender, System.EventArgs e) {

 ...

 oleDbConnection1.Open;

 ds = new DataSet;

Затем

мы должны присвоить объектам
OleDbDataAdapter
запросы и соединить их с объектом соединения:

 ds = new DataSet;

 daAttendees =

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
, когда пользователь пытается выбрать дату из календаря, и когда сделана заявка на мероприятие и мы хотим задать новую дату, чтобы помешать пользователю заказать подряд два мероприятия в один день до выбора новой даты. Так как это должно быть общим свойством, можно создать также скрытый метод для выполнения этого вычисления. Этот метод должен принимать пробную дату в качестве параметра и возвращать дату для использования, которая будет либо той же датой, что и пробная, или следующим доступным днем после пробной даты.

Код, который это делает,

getFreeDate
, показан ниже:

private System.DateTime getFreeDate(System.DateTime trialDate) {

 if (eventTable.Rows.Count > 0) {

System.DateTime=testDate;

bool trialDateOK = false;

while (!trialDateOK) {

trialDateOK = true;

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
и выполним сравнение даты с датами существующих мероприятий:

protected void calendar_SelectionChanged(object sender, System.EventArgs e) {

 System.DateTime trialDate = calendar.SelectedDate;

Поделиться с друзьями: