Различные календари в элементе управления календарем ASP.NET - PullRequest
2 голосов
/ 24 декабря 2009

Мне нужно создать страницу ASP.NET, которая отображает элемент управления Calendar, который отображает определенный календарь на основе значения, выбранного в раскрывающемся списке. В настоящее время мне нужно отобразить HebrewCalendar и обычный (григорианский) календарь, но в будущем мне, вероятно, понадобятся другие. Конечно, я не могу использовать региональные настройки Windows или определение глобализации в web.config, поскольку требуемый календарь устанавливается во время выполнения. Как я могу отображать различные календари в элементе управления Calendar?

Спасибо!

Ответы [ 2 ]

6 голосов
/ 27 декабря 2009

Хитрость в том, что вам нужно установить Культуру текущего потока, и (для некоторых локалей, таких как иврит) также необходимо установить Календарь внутри этой Культуры.

Пример автономного кода ниже иллюстрирует, как это сделать. Этот подход, конечно, может повлиять на локализованный текст других элементов управления. Если это проблема - и вы хотите только локализовать элемент управления Calendar и оставить все остальное на английском языке - тогда вы можете сделать следующее:

  • наследует класс из элемента управления Calendar ASP.NET и переопределяет метод Render ().
  • в вашей реализации Render (), сохраните культуру текущего потока / UICulture, затем сбросьте культуру и календарь текущего потока, используя код ниже, затем вызовите Render базового класса (), затем восстановите культуру / UICulture токовая нить
  • используйте этот класс вместо обычного календаря ASP.NET на своей странице ASPX.

Вот код:

<%@ Page Language="C#" AutoEventWireup="true" %>
<%@ Import Namespace="System.Globalization"%>
<%@ Import Namespace="System.Threading"%>
<%@ Import Namespace="System.Collections.Generic"%>
<html>
<body>
    <form id="form1" runat="server">
    Choose a language and calendar: <asp:DropDownList ID="LocaleChoice" runat="server" AutoPostBack="true">
        <asp:ListItem Value="en-US" Selected="True">English</asp:ListItem>
        <asp:ListItem Value="es-MX">Español</asp:ListItem>
        <asp:ListItem Value="de-DE">Deutsch</asp:ListItem>
        <asp:ListItem Value="he-IL|HebrewCalendar">Hebrew (Hebrew Calendar)</asp:ListItem>
        <asp:ListItem Value="he-IL|GregorianCalendar">Hebrew (Gregorian Calendar)</asp:ListItem>
        <asp:ListItem Value="ar-SA|HijriCalendar">Arabic (Hijri Calendar)</asp:ListItem>
        <asp:ListItem Value="ar-SA|GregorianCalendar">Arabic (Gregorian Calendar)</asp:ListItem>
    </asp:DropDownList><br /><br />
    <asp:Calendar ID="Calendar1" runat="server"></asp:Calendar>
    </form>
</body>
</html>
<script runat="server">

    Dictionary<string, System.Globalization.Calendar> Calendars =
        new Dictionary<string, System.Globalization.Calendar>()
        {
            {"GregorianCalendar", new GregorianCalendar()},
            {"HebrewCalendar", new HebrewCalendar()},
            {"HijriCalendar", new HijriCalendar()},
            {"JapaneseCalendar", new JapaneseCalendar()},
            {"JulianCalendar", new JulianCalendar()},
            {"KoreanCalendar", new KoreanCalendar()},
            {"TaiwanCalendar", new TaiwanCalendar()},
            {"ThaiBuddhistCalendar", new ThaiBuddhistCalendar ()}
        };

    protected override void InitializeCulture()
    {
        if (Request.Form["LocaleChoice"] != null)
        {
            string selected = Request.Form["LocaleChoice"];
            string[] calendarSetting = selected.Split('|');
            string selectedLanguage = calendarSetting[0];

            CultureInfo culture = CultureInfo.CreateSpecificCulture(selectedLanguage);

            if (calendarSetting.Length > 1)
            {
                string selectedCalendar = calendarSetting[1];
                var cal = culture.Calendar;
                if (Calendars.TryGetValue(selectedCalendar, out cal))
                    culture.DateTimeFormat.Calendar = cal;
            }

            Thread.CurrentThread.CurrentCulture = culture;
            Thread.CurrentThread.CurrentUICulture = culture;
        }
        base.InitializeCulture();
    }

    protected void Page_Load(object sender, EventArgs e)
    {
    }
</script>
0 голосов
/ 16 июня 2010

Если вам нужна индивидуальная настройка календаря, взгляните на BaseCalendar (имеется демонстрационная версия, которая обрабатывает этот сценарий). Изменение культуры текущего потока может иметь побочные эффекты в других местах. BaseCalendar позволяет вам указать культуру для календаря без изменения культуры текущего потока.

...