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

ЖАНРЫ

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

Ватсон Карли

Шрифт:

 calendar.SelectedDate = getFreeDate(trialDate);

}

Этот код идентичен коду в

Page_Load
.

Третий момент, когда необходимо выполнить эту проверку, возникает при нажатии кнопки заказа. Мы вернемся к этому немного позже, так как мы должны внести несколько изменений.

Затем мы хотим изменить цвет ячейки дня календаря, чтобы обозначить существующие мероприятия. Чтобы сделать это, необходимо добавить обработчик событий для события

DayRender
объекта календаря. Это событие происходит всякий раз при изображении отдельного дня и предоставляет нам доступ
к объекту выводимой ячейки и дате этой ячейки с помощью свойств
Cell
и Date параметра
DayRenderEventArgs
функции обработчика. Нам нужно просто сравнить дату изображаемой ячейки с датами в объекте
eventTable
и покрасить ячейку с помощью свойства
Cell.BackColor
, если существует совпадение:

protected void calendar_DayRender(object sender, System.Web.UI.WebControls.DayRenderEventArgs e) {

 if (eventTable.Rows.Count > 0) {

System.DateTime testDate;

fоreach (System.Data.DataRow testRow in eventTable.Rows) {

testDate = (System.DateTime)testRow["EventDate"];

if (testDate.Date == e.Day.Date) {

e.Cell.BackColor = Color.Red;

}

}

 }

}

В данном случае используется красный цвет, который дает нам следующее изображение:

Здесь 15, 27, 28, 29 и 30 марта содержат мероприятия, а пользователь выбирает 17 марта. Теперь, после добавления логики выбора даты, невозможно выбрать день, который показан красным цветом, и если делается такая попытка, то вместо этого будет выбрана следующая дата. Например, щелчок на 28 марта в показанном выше календаре приведет к выбору 31 марта.

Запись мероприятий в базу данных

Обработчик событий

submitButton_Click
в настоящее время собирает строку из характеристик мероприятия и выводит ее в элементе управления
resultLabel
. Чтобы добавить мероприятие в базу данных, нужно реформатировать созданную строку в запрос SQL
INSERT
и выполнить его.

Большая часть следующего кода выглядит знакомо:

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

 foreach (System.Web.UI.WebControls.WebControl validator in this.Validators) {

validator.Enabled = true;

 }

 this.Validate;

 if (this.IsValid) {

String attendees = "";

foreach (ListItem attendee in attendeeList.Items) {

if (attendee.Selected) {

attendees += attendee.Text + " (" + attendee.Value + "), ";

}

}

attendees += " and " + nameBox.Text;

String dateString =

calender.SelectedDate.Date.Date.ToShortDateString;

String oleDbCommand = "INSERT INTO Events (Name, Room, " +

"AttendeeList, EventDate) VALUES ('" + eventBox.Text + "', '" +

roomList.SelectedItem.Value + "', '" +

attendees + "', '" + dateString + "')";

После

создания строки запроса SQL можно использовать ее для построения объекта
OleDb.OleDbCommand
:

System.Data.OleDb.OleDbCommand insertCommand =

new System.Data.OleDb.OleDbCommand(oleDbCommand, oleDbConnection1);

После этого снова открываем соединение, которое было закрыто в

Page_Load
(это снова, возможно, не самый эффективный способ реализации, но он прекрасно подходит для целей демонстрации) и выполняем запрос:

oleDbConnection1.Open;

int queryResult = insertCommand.ExecuteNonQuery;

Метод

ExecuteNonQuery
возвращает целое число, определяющее, сколько строк таблицы были изменены запросом. Если оно равно 1, то это означает, что вставка была успешной. Если это так, то мы помещаем сообщение об успешном выполнении в
resultLabel
, выполняем новый запрос для повторного заполнения
eventTable
и множества данных новым списком мероприятий (мы очищаем сначала множество данных, иначе события будут дублироваться) и изменяем выбор в календаре на новую, свободную, дату:

if (queryResult == 1) {

resultLabel.Text = "Event Added.";

daEvents =

new System.Data.OleDb.OleDbDataAdapter("SELECT * FROM Events" oleDbConnection1);

dsClear;

daEvents.Fill(ds, "Events");

eventTable = ds.Tables["Events"];

calendar.SelectedDate =

getFreeDate(calendar.SelectedDate.AddDays(1));

}

Если

ExecuteNonQuery
возвращает число, отличное от единицы, то это говорит о том, что возникла проблема. В данном примере мы не будем это затрагивать, а просто выведем уведомление об отказе в
resultLabel
:

else {

resultLabel.Text = "Event not added due to DB access " + "problem.";

}

И в конце мы снова закрываем соединение:

oleDbConnection1.Close;

} else {

validationSummary.Enabled = true;

}

 }

Таким образом, версия с доступом к базе данных приложения для предварительной заявки мероприятий завершена.

Отметим, что в связи с синтаксисом запроса SQL INSERT, мы должны избегать некоторых символов в названии мероприятия, таких как апострофы " ' ", так как они будут вызывать ошибку. Было бы относительно легко реализовать специальное правило проверки, которое не разрешает пользователям применять такие символы или выполнять некоторый тип кодирования символов перед вставкой данных и после считывания данных, но код для выполнения этого не будет здесь рассмотрен.

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