2009-12-24 62 views
2

我需要創建一個ASP.NET頁面,該頁面顯示一個日曆控件,該控件根據下拉列表中選定的值顯示特定的日曆。 目前我需要顯示HebrewCalendar和regualr(格里高利)日曆,但將來我可能需要其他人。 當然,我無法使用Windows的區域設置或web.config中的全球化定義,因爲所需的日曆是在運行時設置的。 如何在日曆控件中顯示各種日曆?ASP.NET日曆控件中的各種日曆

謝謝!

回答

5

訣竅是你需要設置當前線程的文化,並且(對於希伯來語等一些語言環境)也需要在該文化中設置日曆。

下面的自包含代碼示例說明了如何執行此操作。這種方法當然可能會影響其他控件的本地化文本。如果這是一個問題 - 並且您只想本地化日曆控件並將剩餘的英文留言 - 則可以執行以下操作:

  • 從ASP.NET的Calendar控件派生類並重寫Render () 方法。在你的Render()實現中,保存當前線程的文化/ UICulture,然後使用下面的代碼重置當前線程的文化和日曆,然後調用基類的Render(),然後恢復文化/ UICulture curren線程
  • 在您的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> 
+0

+1:這篇文章值得! – 2010-07-02 14:48:13

0

如果你需要每個日曆文化的定製看看BaseCalendar(有一個演示包括一個處理這種情況下)。改變當前線程的文化可能會在其他地方產生副作用。 BaseCalendar允許您爲日曆指定文化,而無需更改當前線程的文化。