ASP.NET日历控件中的各种日历

时间:2009-12-24 19:21:53

标签: asp.net calendar globalization

我需要创建一个显示Calendar控件的ASP.NET页面,该控件根据下拉列表中选择的值显示特定日历。 目前我需要显示HebrewCalendar和regualr(格里高利)日历,但将来我可能需要其他人。 当然,我不能使用Windows的区域设置或web.config中的全球化定义,因为在运行时设置了所需的日历。 如何在Calendar控件中显示各种日历?

谢谢!

2 个答案:

答案 0 :(得分:6)

诀窍是你需要设置当前线程的文化,并且(对于像希伯来语这样的某些语言环境)还需要在该文化中设置日历。

下面的自包含代码示例说明了如何执行此操作。这种方法当然可能会影响其他控件的本地化文本。如果这是一个问题 - 您只想本地化Calendar控件并将其余部分保留为英语 - 那么您可以执行以下操作:

  • 从ASP.NET的Calendar控件派生一个类,并覆盖Render()方法。
  • 在你的Render()实现中,保存当前线程的culture / UICulture,然后使用下面的代码重置当前线程的文化和日历,然后调用基类的Render(),然后恢复文化/ UICulture当前线程
  • 在ASPX页面中使用该类,而不是常规的ASP.NET日历。

以下是代码:

<%@ 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>

答案 1 :(得分:0)

如果您需要按日历文化定制,请查看BaseCalendar(包含处理此方案的演示)。改变当前线程的文化可能会在其他地方产生副作用。 BaseCalendar允许您为日历指定文化,而无需更改当前线程的文化。