Calendar
Этот класс не имеет аналогов в HTML. Определив единственный элемент управления, можно создать и предоставить в распоряжение посетителей полноценный календарь, где они смогут прокручивать месяцы, выбирать день или неделю. Внешний вид этого элемента управления может быть самым разнообразным. И все это реализуется средствами HTML. Раньше это было возможно только с помощью ActiveX — контролов, которые нужно загружать с сервера, регистрировать в системе и проверять на безопасность.
Calendar имеет множество свойств.
CellPadding | "Набивка" (расстояние между границами клетки и ее содержимым) |
CellSpacing | Расстояние между клетками |
DayNameFormat | Способ написания названий дней недели. Может принимать значения FirstLetter, FirstTwoLetters, Full, Short |
FirstDayOfWeek | Для задания первого дня недели, Default — установки, принятые в системе |
NextPrevFormat | Показ названий предыдущего и последующего месяцев. FullMonth — полное название, ShortMonth — первые 3 буквы, CustomText — любой текст, определенный программистом |
SelectionMode | Способ выбора даты. Доступны Day, DayWeek, DayWeekMonth и None |
ShowDayHeader | Показывать ли названия дней недели (да по умолчанию) |
ShowGridLines | Показывать ли сетку (нет по умолчанию) |
ShowTitle | Показывать ли заголовок (нет по умолчанию) |
TitleFormat | MonthYear, Month |
TodaysDate | Какая дата будет выбрана текущей. По умолчанию — дата на сервере |
VisibleDate | Месяц, который будет показан в календаре |
Calendar поддерживает различные календарные системы — не только привычный григорианский, но и юлианский, иудейский, мусульманский, буддистский.
Это можно сделать, изменяя культурную информацию страницы.
Выбор клиентом даты начала путешествия на сайте туристического агентства:
<%@ Page Language="C#" %>
<script runat="server"> void Page_Load(Object sender, EventArgs e) { if (Page.IsPostBack) { TextToUser.Text = "Вы поедете " + calVoyage.SelectedDate.ToLongDateString();
} }
void calSelectChange(Object sender, EventArgs e) { if (calVoyage.SelectedDate > DateTime.Today) { TextToUser.Text = "Вы действительно хотите отпра- виться в путешествие " + calVoyage.SelectedDate.ToShortDateString() + "?"; Button ok = new Button(); ok.Width = 100; ok.Text = "Да"; form1.Controls.Add(ok); } else TextToUser.Text="Выберите будущую дату"; }
</script>
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Пример календаря</title> </head> <body> <form runat="server" id="form1"> <asp:Calendar ID="calVoyage" runat="server" BackColor="lightgreen" CellPadding="3" CellSpacing="3" NextPrevFormat="FullMonth" SelectionMode="DayWeekMonth " OnSelectionChanged="calSelectChange" /> <asp:Label ID="TextToUser" runat="server" Font- Bold="True" Font-Underline="False" /><br> </form> </body> </html>
Если мы посмотрим на HTML-код страницы, которая сгенерирована этой программой, то увидим довольно объемный текст, в том числе функцию на JavaScript и большую таблицу, каждая ячейка которой ссылается на эту функцию.
Было бы непросто написать все это самим.
Свойства SelectMonthText и SelectWeekText задают символы HTML, по умолчанию > и >> эта последовательность отображается в символы >.
С событием выбора даты OnSelectionChanged связан обработчик calSelectChange. В нем мы сначала проверяем, является ли выбранная дата будущей по отношению к сегодняшнему дню. Если да, то создается новая кнопка для подтвержения выбранной даты.
Такая строка в Page_Load —
this.Culture=new CultureInfo("th-TH").ToString();
сделает календарь таким, какой принят в Таиланде. Не забудьте включить пространство имен глобализации:
%@Import Namespace= "System.Globalization" %
Свойство SelectionMode, равное DayWeekMonth, позволяет выбрать как конкретный день, так и неделю или месяц. Как же получить выбранный диапазон дат? SelectedDate возвращает только первый день диапазона. Для этого существует коллекция Calendar1.SelectedDates:
TextToUser.Text = "Вы пробудете в путешествии "; for (int i = 0; i < calVoyage.SelectedDates.Count; i++) { TextToUser.Text += calVoyage.SelectedDates[i].ToShortDateString() + "<br>"; }
А еще элегантнее будет написать так:
foreach ( DateTime i in calVoyage.SelectedDates) { TextToUser.Text += i.ToShortDateString() + "<br>"; }
Можно запретить пользователю выбирать прошлую дату. Для этого можно воспользоваться свойством IsSelectable:
if (e.Day.Date < DateTime.Now) { e.Day.IsSelectable = false; }