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

Модификация элемента управления календарем

Модификация элемента управления календарем

Прежде чем обсуждать добавление событий к базе данных, давайте сделаем модификацию в выводе изображения календаря. Было бы неплохо выводить любой день, где была сделана предварительная заявка, другим цветом, и сделать такие дни недоступными для выбора. Это потребует модификации способа, которым даты задаются в календаре, и способа, которым выводятся ячейки дней.

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

Оглавление книги


Генерация: 1.302. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз