帮酷LOGO
0 0 评论
文章标签:控制  LAN  SUP  for  日期  日期格式  Formats  LANG  

介绍

因特网上有很多日期控件,在CodeProject中包括很多。 然而,很少有人使用. NET's System.Globalization 类来检索外来语言中的月份名称。 在不知道口语语言的情况下,可以实现南洲语中的月份名称。 此外,我还增加了使用任何日期格式的可能性。 这里控件适用于我们或者欧洲日期格式。 控件还具有 Visual Studio 设计器支持。

背景

System.Globalization 命名空间包含定义区域性相关信息的类,包括语言,国家/地区,使用日历,货币格式。

在CodeProject上,我使用了 David Truxall控件作为控件的模板,以及以下附加功能:

属性

属性默认值描述
YearsForward0( 可选) 一个整数,用于设置控件在当前年份呈现的年份数。
YearsBack0( 可选) 一个整数,用于设置控件从当前年份呈现到的年份数。
Culture( 可选) 字符串 显示月份名称的区域性 NAME 相同。 例如 es。请参见MSDN以获得完整列表。 如果没有设置,则使用服务器代码区域。

- 它对控件的值没有任何影响。
MonthFormatMMMM( 可选) 字符串 设置控件中的月份文本。

示例 MMM,MMMM,MM。

- 它对控件的值没有任何影响。
DateFormat将服务器上的格式用作默认格式A 字符串 用于设置输出日期值格式。

例如 dd/MM/yyyy MM-dd-yyyy YYYYMMDD
Value设置值的值 日期

如果使用 dd/MM/yyyy,请注意,如果使用双精度数字设置该值,例如 02/04/2005 while 0/4/2005 有效。
SelectCurrentDatetrue当未指定值时将值设置为当前日期的布尔值。

使用示例:

<%@RegisterTagPrefix="cc1"Namespace="i386.UI"Assembly="i386.UI"%>

德语具有短月文本,10年到未来,从当前年到过去两年:

<cc1:dropdowndatetimeid="DropDownDateTime1"runat="server"YearsForward="2"YearsBack="10"Culture="de-DE"SelectCurrentDate="False"MonthFormat="MMM"></cc1:dropdowndatetime>

使用以下方法设置日期格式 日期 :

<cc1:dropdowndatetimeid="Dropdowndatetime4"runat="server"dateFormat="MM/dd/yyyy"Value="11/02/2005"></cc1:dropdowndatetime>

YearsForwardYearsBack 属性可以有负值,该值控制范围以及顺序:

YearsForwardYearsBack显示年份
-11201985.。1994
11-201994.。1985
11201985.。2016

控件的工作方式

首先,将 DateFormat 设置为在服务器上使用的当前用户,除非设置了 DateFormat 属性。

privatestring _DateFormat= 
 System.Threading.Thread.CurrentThread.
 CurrentCulture.DateTimeFormat.ShortDatePattern; publicstring Value 
{
 get 
 {
 string s = (string)ViewState["Value"];
 if(s == null) returnString.Empty;
 elsereturn s;
 } 
 set 
 {
 this.SetSelected(value);
 ViewState["Value"] = value;
 }
}privatevoid SetSelected(string StoredValue)
{
 DateTimeFormatInfo formatInfo = 
 new DateTimeFormatInfo();
 formatInfo.FullDateTimePattern = DateFormat;
 DateTime dt = DateTime.ParseExact(StoredValue,
 DateFormat,formatInfo); 
 SelectedDay = dt.Day;
 SelectedMonth = dt.Month;
 SelectedYear = dt.Year; 
}

控件实现 IPostBackDataHandler 以在更改 postback 时管理控件值的重置。 这与truxall相同,除了用于构建 postCollectionValue 属性。

bool IPostBackDataHandler.LoadPostData(string postDataKey, 
 System.Collections.Specialized.NameValueCollection postCollection)
{
. . ..
. . .. 
 if(this.SelectedDay == -1 && this.SelectedMonth == -1 && 
 this.SelectedYear == -1)
 this.Value = "";
 else {
 // Build a DateTime string based on the DateFormat DateTimeFormatInfo formatInfo = new DateTimeFormatInfo();
 formatInfo.FullDateTimePattern = DateFormat;
 DateTime dt = new DateTime(this.SelectedYear, 
 this.SelectedMonth, this.SelectedDay);
 this.Value = dt.ToString(DateFormat,formatInfo);
 }
}

生成子控件

SelectCurrentDate 设置为 true 默认情况下,控件的Value 为空,我们将控件设置为当前日期。 我们使用 DateTimeFormatInfoDateFormat 将日期正确地格式化为 字符串 对于 Value 属性。如果将 SelectCurrentDate 设置为 false 控件设置为 drop drop中列出的第一年的第一年 1st。 我们使用JavaScript限制闰年,并保持 Value 输入框更新。 客户端和服务器值保持 Value的最新状态。

protectedoverridevoid CreateChildControls()
{
 DateTime dt = DateTime.Today;
 // Use CurrentDate if Value is empty and // SelectCurrentDate is true.if (SelectCurrentDate && this.Value=="")
 {
 // Use Current Date SelectedDay = dt.Day;
 SelectedMonth = dt.Month;
 SelectedYear = dt.Year;
 DateTimeFormatInfo formatInfo = 
 new DateTimeFormatInfo();
 formatInfo.FullDateTimePattern = DateFormat;
 this.Value = dt.ToString(DateFormat,formatInfo);
 }
 // Days DropDownList ddlboxDay = new DropDownList();
 ddlboxDay.ID ="Day";
 ddlboxDay.Attributes.Add("onchange",
 "ChangeOptionDays('" + this.ClientID +"',
 '" + DateFormat + "');");
 for (int nDay = 1; nDay<32; nDay++)
 ddlboxDay.Items.Add(nDay.ToString());
 // So we can restore the Culture later CultureInfo ExistingCulture = 
 System.Threading.Thread.CurrentThread.CurrentCulture; 
 // Culture - changes language of months if (Culture!=null) 
 System.Threading.Thread.CurrentThread.CurrentCulture = 
 new System.Globalization.CultureInfo(Culture); 
 // Months DropDownList ddlboxMonth = new DropDownList();
 ddlboxMonth.ID ="Month";
 ddlboxMonth.Attributes.Add("onchange",
 "ChangeOptionDays('" + this.ClientID +"',
 '" + DateFormat + "');");
 for ( int nMonth=1; nMonth<=12; nMonth++)
 { 
 DateTime MonthDate = new DateTime(2000,nMonth,1);
 ddlboxMonth.Items.Add(new 
 ListItem(MonthDate.ToString(this.MonthFormat),
 nMonth.ToString()));
 }
 // Restore  System.Threading.Thread.CurrentThread.CurrentCulture = 
 ExistingCulture;
 // Years (Forward and Back properties)  DropDownList ddlboxYear = new DropDownList();
 ddlboxYear.ID ="Year";
 ddlboxYear.Attributes.Add("onchange",
 "ChangeOptionDays('" + this.ClientID +"',
 '" + DateFormat + "');");
 ddlboxYear.ID ="Year";
 if (YearsBack>=0)
 {
 for (int nYear = -YearsBack; nYear<=YearsForward; nYear++)
 {
 int ddlYear =dt.Year+nYear;
 ddlboxYear.Items.Add(ddlYear.ToString());
 }
 }
 else {
 for (int nYear = YearsForward; nYear<=-YearsBack; nYear++)
 {
 int ddlYear =dt.Year-nYear;
 ddlboxYear.Items.Add(ddlYear.ToString());
 }
 }
 // Select the DropDownList for the yearif (SelectedYear>0)
 {
 // See if the year is in the list.if (ddlboxYear.Items.FindByValue(SelectedYear.ToString())!=null) 
 {
 ddlboxYear.Items.FindByValue(SelectedYear.ToString()).Selected = 
 true;
 }
 }
 if (SelectedMonth>0) 
 ddlboxMonth.Items.FindByValue(SelectedMonth.ToString()).Selected = true;
 if (SelectedDay>0) 
 ddlboxDay.Items.FindByValue(SelectedDay.ToString()).Selected = true;
 // Add Child Control Controls.Add(ddlboxDay);
 Controls.Add(ddlboxMonth);
 Controls.Add(ddlboxYear);

调试模式

它用于检查控件中发生了什么。 DebugMode 输出 ValueViewStatesCultureInfoDateFormat。 若要设置 DebugMode,请使用 debugmode="true""

<cc1:dropdowndatetimeDebugMode=true id="DropDownDateTime1"runat="server"></cc1:dropdowndatetime>

浏览器兼容性

这只是我测试过的浏览器的一个简短列表。 我的电脑上没有安装 Netscape。

浏览器OS
Safari 1.0.3
Mac系统 9 +完全
Netscape 4.77Mac系统 10.2.8不是
Opera 6.0.3Mac系统 10.2.8完全
IE 5.1,5.2Mac系统 9 +完全
Firefox 1.xWindows XP完全
IE 4.0 +Windows XP完全
网景?Windows

IE 3.0将需要使用服务器验证。 如果某个浏览器无法正常工作,请让我知道。

JavaScript支持

在调试模式中,你可能会注意到隐藏的输入框。 这个输入框可以在 postback 对服务器进行之前使用。

更新,版本和 Bug 修复

  • 18th 2005年05月 版本 0.2
    • 添加并修复了 YearsForwardYearsBack 属性的负值。
    • 支持旧的JavaScript浏览器。

未来的增强功能

  • 支持和测试使用服务器验证的旧和非/禁用JavaScript浏览器。
  • EnableSetDate 属性还没有完成。 这里功能通过使用复选框启用/禁用日期框,并允许空白日期。
  • 针对日期和闰年的服务器验证。 源代码中包含一个 DateTimeValidator
  • 另一个特性是支持 Value 年份超出 YearsForwardYearsBack 属性范围的。
  • 时间支持。

欢迎发表评论或者添加功能。 如果你降低这个页面的速度,请在下面的论坛中留言。



文章标签:控制  for  SUP  form  LAN  LANG  格式  日期  

Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语