Опубликован: 14.11.2006 | Доступ: свободный | Студентов: 5902 / 538 | Оценка: 4.18 / 3.74 | Длительность: 16:37:00
ISBN: 978-5-9556-0085-7
Лекция 4:

Серверные элементы управления (продолжение)

< Лекция 3 || Лекция 4: 12345 || Лекция 5 >

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, по умолчанию &gt; и &gt;&gt; эта последовательность отображается в символы >.

С событием выбора даты 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;
}

Автоформатирование календаря

У календаря не один стиль, а несколько. Разные стили применяются к заголовку, к выходным и будним дням, дням нетекущих месяцев и к сегодняшнему дню. Стили можно задать как с помощью внешних классов, так и непосредственно. Все это просто поражает. Можно поставить календарь на тысячах разных сайтов, и везде он будет выглядеть по-разному.

В Visual Studio 2005 можно поменять внешний вид календаря с помощью предопределенных шаблонов. У многих элементов управления в режиме дизайна есть "умные ярлычки" (smart tags). В них есть ссылка на диалог автоформатирования календаря. При этом уже сделанные изменения свойств сохранятся.

Внешний вид календаря можно менять в обработчике события DayRender. У аргумента обработчика DayRenderEventArgs два свойства: Cell с типом TableCell — наследника WebControl и Day типа CalendarDay. В Cell можно добавлять новые элементы, но только такие, которые не запускают событий:

protected void calVoyage_DayRender(object sender, 
DayRenderEventArgs e)
    {
        if (e.Day.Date.Day == 8 && e.Day.Date.Month == 3)
        {
            e.Cell.BorderColor = System.Drawing.Color.Red;
            e.Cell.BorderWidth = 4;
            e.Cell.Controls.Add(new LiteralControl("<br>Без жен-
щин жить нельзя"));
        }
    }

В этом примере проверяется день, и если это 8 марта, то вокруг него рисуется красная рамка. А еще добавляется элемент LiteralControl с текстом, соответствующим моменту.


Рис. 4.3.
< Лекция 3 || Лекция 4: 12345 || Лекция 5 >
Алексей Савельев
Алексей Савельев

https://technet.microsoft.com/en-us/library/ms143221(v=sql.105).aspx

Денис Прокофьев
Денис Прокофьев

Везде написано, что это самый независимый и простой в использовании навигационный элемент управления, что он работает сразу с web.sitemap и не требует определения SiteMapDataSource.

Моя карта сайта состоит из двух страниц, вложенных друг в друга. asp:Menu, asp:TreeView отбображаются как ожидалось, а вот asp:SiteMapPath - нет. Он не виден нигде. Однако на его месте формируется разметка: <span id="SiteMapPath1"><a href="#SiteMapPath1_SkipLink" style="position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden;">Проход по ссылкам навигации</a><a id="SiteMapPath1_SkipLink"></a></span> - т.е. элемент отрабатывает.

В словах xHTML это выглядит так: <asp:SiteMapPath ID="SiteMapPath1" runat="server" />. Причем не важно - внутри тега form или снаружи - всегда одинаково.

Т.к. другие нав. ЭУ работают через простой источник данных без ошибок, делаю вывод - карта составлена правильно. ИД: <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" />

Карта: <?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
  <siteMapNode url="~/L11_1_simplePage.aspx" title="Страница 1"  description="Простая страница 1." >
    <siteMapNode url="~/L11_1SimplePage2.aspx" title="Страница 2"  description="Простая страница 2" />
  </siteMapNode>
</siteMap>

Почему так происходит? Вроде делаю все по примерам. VS Community 2015. NetFramework в проекте: v4.0.30319