日期控件:日期选择控件



思路:实现日期年月日选择
1、可以设定年起止年份
2、排除不正确日期选择可能
3、使用javascript实现控制
4、使用Text属性方便获取设置日期值
=
代码如下:
using ;
using .Collections;
using .Collections.Specialized;
using .ComponentModel;
using .IO;
using .Text;
using .Web.UI;
using .Web.UI.Design.WebControls;
using .Web.UI.WebControls;

JSY
{
/// <summary>
/// AspNetDate 选择输入日期Control控件
/// </summary>
[DefaultProperty(\"Text\"),
ParseChildren(false),
PersistChildren(false),
Description(\"专用于ASP.Net Web应用日期Control控件\"),
Designer(typeof(DateDesigner)),
ToolboxData(\"<{0}:JSYNetDate runat=server></{0}:JSYNetDate>\")]
public JSYNetDate:Panel,INamingContainer,IPostBackDataHandler
{
#region 属性
/// <summary>
/// 获取/设置日期值
/// </summary>
[Bindable(true),
Browsable(true),
Description(\"日期值\"),
Category(\"外观\"),
DefaultValue(\"\")]
public Text
{
get
{
(ViewState[\"Text\"] != null)
{
ViewState[\"Text\"].;
}

{
(IsNull)
{
\"\";
}

{
DateTime date=.DateTime.Today;
str=\"\";
switch (DateFormat)
{
\"YMD\":
str=date.(\"yyyy-MM-dd\",.Globalization.DateTimeFormatInfo.InvariantInfo);
;
\"YM\":
str=date.(\"yyyy-MM\",.Globalization.DateTimeFormatInfo.InvariantInfo);
;
\"Y\":
str=date.Year.;
;
}
str;
}
}
}


{
(value\"\")
{
ViewState[\"Text\"] = \"\";
}
(DateFormat\"YMD\")
{
DateTime date;
try
{
date=Convert.ToDateTime(value);
}
catch
{
date=.DateTime.Today;
}
str = date.(\"yyyy-MM-dd\",.Globalization.DateTimeFormatInfo.InvariantInfo);
(str\"1900-01-01\")
str=\"\";
ViewState[\"Text\"] =str;
}

{
ViewState[\"Text\"] = value;
}
}
}
/// <summary>
/// 获取/设置日期值是否允许空
/// </summary>
[Browsable(true),
Description(\"日期值是否允许空\"),
Category(\"布局\"),
DefaultValue(false)]
public bool IsNull
{
get
{
(ViewState[\"IsNull\"]null)?false:true;
}

{
(value)
ViewState[\"IsNull\"]=true;
}
}
/// <summary>
/// 获取/设置日期值格式(YMD:年-月-日 YM:年-月 Y:年)
/// </summary>
[Browsable(true),
Description(\"日期值格式(YMD:年-月-日 YM:年-月 Y:年)\"),
Category(\"布局\"),
DefaultValue(\"YMD\")]
public DateFormat
{
get
{
(ViewState[\"DateFormat\"]null)?\"YMD\":()ViewState[\"DateFormat\"];
}


{
ViewState[\"DateFormat\"]=value;
}
}
/// <summary>
/// 获取/设置日期值能否编辑
/// </summary>
[Browsable(true),
Description(\"能否编辑\"),
Category(\"行为\"),
DefaultValue(true)]
public override bool Enabled
{
get
{
(ViewState[\"Enabled\"]null)?true:false;
}


{
(!value)
ViewState[\"Enabled\"]=false;
}
}
/// <summary>
/// 获取/设置日期值中可供选择年份长度
/// </summary>
[Browsable(true),
Description(\"日期值中可供选择年份长度\"),
Category(\"布局\"),
DefaultValue(100)]
public Length
{
get
{
object obj=ViewState[\"Length\"];
(objnull)?100:()obj;
}


{
ViewState[\"Length\"]=value;
}
}
/// <summary>
/// 获取/设置选择年份结束值
/// </summary>
[Browsable(true),
Description(\"日期值中选择结束年份,当小于100时表示距今年数\"),
Category(\"布局\"),
DefaultValue(0)]
public End
{
get
{
object obj=ViewState[\"End\"];
y;
(objnull)
{
y=.DateTime.Today.Year;
}

{
y=()obj;
(y<100)
{
y=.DateTime.Today.Year+y;
}
}
y;
}


{
ViewState[\"End\"]=value;
}
}
/// <summary>
/// 获取选择年份开始值
/// </summary>
[Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public Start
{
get{ End-Length;}
}

#endregion
#region 重写事件
/// <summary>
/// 重写OnLoad 思路方法
/// </summary>
/// <param name=\"e\">包含事件数据 <see cref=\"EventArgs\"/> 对象</param>
protected override void _disibledevent=> m=Page.Request.Form[this.UniqueID+\"_month\"];
d=Page.Request.Form[this.UniqueID+\"_day\"];
switch (DateFormat)
{
\"YMD\":
(y\"\" || m\"\" || d\"\")
{
Text=\"\";
}

{
Text=y+\"-\"+m+\"-\"+d;
}
;
\"YM\":
(y\"\" || m\"\")


{
Text=\"\";
}

{
Text=y+\"-\"+m;
}
;
\"Y\":
(y\"\")
{
Text=\"\";
}

{
Text=y;
}
;
}
}
base.OnLoad(e);
}
/// <summary>
/// 重写<see cref=\".Web.UI.WebControls.WebControl.AddAttributesToRender\"/> 思路方法验证是否有form(runat=server)Control控件
/// </summary>
/// <param name=\"writer\"></param>
protected override void AddAttributesToRender(HtmlTextWriter writer)
{
(this.Page!=null)
this.Page.VeryRenderingInServerForm(this);
base.AddAttributesToRender(writer);
}
/// <summary>
/// 重写<see cref=\".Web.UI.Control.OnPreRender\"/>思路方法
/// </summary>
/// <param name=\"e\">包含事件数据 <see cref=\"EventArgs\"/> 对象</param>
protected override void _disibledevent=>//原创:贾世义 日期:2005-08-16 免费共享 v1.0
//邮箱:[email protected]
//请尊重版权可以随意使用但请注明出处//

function InitYear(pName,start,length,y)
{
var selYear=eval(\'document.forms[0].\'+pName+\'_year\');
var n=selYear.length;
selYear.length=n+length+1;
for (i=0;i<=length;i)
{
selYear.options[n+i].value=(i+start);
selYear.options[n+i].text=(i+start);
}
(y0)
{
selYear.selectedIndex =0;
}

{
(y>start)
{
(y-start<=length)
{
selYear.selectedIndex = n+y-start;
}

{
selYear.selectedIndex = length;
}
}
}
}

function InitMonth(pName,m)
{
var selMonth=eval(\'document.all.\'+pName+\'_month\');
var n=selMonth.length;
selMonth.length=n+12;
for (i=1;i<10;i)
{
selMonth.options[n+i-1].value=\'0\'+i;
selMonth.options[n+i-1].text=i;
}
for (i=10;i<=12;i)
{
selMonth.options[n+i-1].value=i;
selMonth.options[n+i-1].text=i;
}
(m0)
{
selMonth.selectedIndex=0;
}

{
selMonth.selectedIndex = n+m-1;
}
}

function InitDay(pName,d)
{
var selDay=eval(\'document.all.\'+pName+\'_day\');
var n=selDay.length;
selDay.length=n+31;
for (i=1;i<10;i)
{
selDay.options[n+i-1].value=\'0\'+i;
selDay.options[n+i-1].text=i;
}
for (i=10;i<=31;i)
{
selDay.options[n+i-1].value=i;
selDay.options[n+i-1].text=i;
}
(d0)
{
selDay.selectedIndex = 0;
}

{
selDay.selectedIndex = n+d-1;
}
dateChange(pName);
}

function dateChange(pName)
{
var selYear=eval(\'document.forms[0].\'+pName+\'_year\');
var year=selYear.options[selYear.selectedIndex].value;
(year!=\'\')
{
var selMonth=eval(\'document.all.\'+pName+\'_month\');
var month=selMonth.options[selMonth.selectedIndex].value;
(month!=\'\')
{
var date= Date(year,month,0);
var day=date.getDate;
var selDay=eval(\'document.all.\'+pName+\'_day\');
var tmp=1;
(selDay.selectedIndex>0)
{
tmp=selDay.options[selDay.selectedIndex].value;
}
selDay.length=day;
for (i=1;i<10;i)
{
selDay.options[i-1].value=\'0\'+i;
selDay.options[i-1].text=i;
}
for (i=10;i<=day;i)
{
selDay.options[i-1].value=i;
selDay.options[i-1].text=i;
}
(tmp>day)
{
selDay.selectedIndex=day-1;
}

{
selDay.selectedIndex=tmp-1;
}
}
}
}

</script>\";
Page.RegisterClientScriptBlock(\"EnableDays\",strJS);
base.OnPreRender(e);
}
/// <summary>
/// 将此Control控件呈现给指定输出参数
/// </summary>
/// <param name=\"writer\"> 要写出到 HTML 编写器 </param>
protected override void Render(HtmlTextWriter writer)
{
writer.Write(\"<table border=\'0\' cellpadding=\'0\' cellspacing=\'0\'><tr><td nowrap align=\'left\'>\");
y=0;
m=0;
d=0;
str=Text;
(str.Length>=4)
{
y=Convert.ToInt32(str.Sub(0,4));
(str.Length>=7)
{
m=Convert.ToInt32(str.Sub(5,2));
(str.Length>=10)
{
d=Convert.ToInt32(str.Sub(8,2));
}
}
}
bool isDate=(DateFormat\"YMD\");
(Enabled)
{
bool isNull=IsNull;
writer.Write(\"<select name=\'\"+this.UniqueID+\"_year\'\");


(isDate)
{
writer.Write(\" _disibledevent=>}
writer.Write(\">\");
(isNull)
{
writer.Write(\"<option value=\'\'></option>\");
}
writer.Write(\"</select>年\");
(DateFormat.Length>1)
{
writer.Write(\"<select name=\'\"+this.UniqueID+\"_month\'\");
(isDate)
{
writer.Write(\" _disibledevent=>}
writer.Write(\">\");
(isNull)
{
writer.Write(\"<option value=\'\'></option>\");
}
writer.Write(\"</select>月\");
writer.Write(@\"
<script language=\'javascript\'>
InitYear(\'\"+this.UniqueID+\"\',\"+Start.+\",\"+Length.+\",\"+y.+@\");
InitMonth(\'\"+this.UniqueID+\"\',\"+m.+@\");
</script>\");
(isDate)
{
writer.Write(\"<select name=\'\"+this.UniqueID+\"_day\'>\");
(isNull)
{
writer.Write(\"<option value=\'\'></option>\");
}
writer.Write(\"</select>日\");
writer.Write(@\"
<script language=\'javascript\'>
InitDay(\'\"+this.UniqueID+\"\',\"+d.+@\");
</script>\");
}
}
}

{
(y0 || m0)
{
writer.Write(\"&nbsp;\");
}

{
writer.Write(y.+\"年\"+m.+\"月\");
(d!=0)
{
writer.Write(d.+\"日\");
}
}
}
writer.Write(\"</td></tr></table>\");
}

public event EventHandler TextChanged;

/// <summary>
/// 当由类实现时为 ASP.NET 服务器Control控件处理回发数据
/// </summary>
/// <param name=\"postDataKey\">Control控件主要标识符</param>
/// <param name=\"postCollection\">所有传入名称值集合</param>
/// <s>如果服务器Control控件状态在回发发生后更改则为 true;否则为 false</s>
public virtual bool LoadPostData( postDataKey, NameValueCollection postCollection)
{
String presentValue = Text;
String postedValue = postCollection[postDataKey];

(presentValue null || !presentValue.Equals(postedValue))
{
Text = postedValue;
true;
}

false;
}


/// <summary>
/// 当由类实现时用信号要求服务器Control控件对象通知 ASP.NET 应用该Control控件状态已更改
/// </summary>
public virtual void RaisePostDataChangedEvent
{
OnTextChanged(EventArgs.Empty);
}


protected virtual void _disibledevent=>TextChanged(this,e);
}
#endregion

}


#region Control控件设计器
/// <summary>
/// 服务器Control控件设计器
/// </summary>
public DateDesigner:.Web.UI.Design.WebControls.PanelDesigner
{
/// <summary>
/// 化 PagerDesigner 新例子
/// </summary>
public DateDesigner
{
this.ReadOnly=true;
}
private JSYNetDate wb;

/// <summary>
/// 获取用于在设计时表示关联Control控件 HTML
/// </summary>
/// <s>用于在设计时表示Control控件 HTML</s>
public override GetDesignTimeHtml
{

wb=(JSYNetDate)Component;
wb.Text=\"\";
StringWriter sw= StringWriter;
HtmlTextWriter writer= HtmlTextWriter(sw);
wb.RenderControl(writer);
sw.;
}

/// <summary>
/// 获取在呈现Control控件时遇到后在设计时为指定异常显示 HTML
/// </summary>
/// <param name=\"e\">要为其显示信息异常</param>
/// <s>设计时为指定异常显示 HTML</s>
protected override GetErrorDesignTimeHtml(Exception e)
{
errorstr=\"创建Control控件时出错:\"+e.Message;
CreatePlaceHolderDesignTimeHtml(errorstr);
}
}
#endregion
}

把以上代码保存为个文件如:JSYNetDate.cs
使用csc /t:library /out:..\\bin\\JSY.dll /r:.Web.dll /r:.dll JSYNetDate.cs编译即可
=
请多留宝贵意见我会继续努力
使用举例
<%@ Register TagPrefix=\"cc1\" Namespace=\"JSY\" Assembly=\"JSY\" %>
<%@ Page language=\"c#\"%>
<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" >
<HTML>
<HEAD>
<title>WebForm1</title>
<meta name=\"GENERATOR\" Content=\"Microsoft Visual Studio .NET 7.1\">
<meta name=\"CODE_LANGUAGE\" Content=\"C#\">
<meta name=\"vs_defaultClientScript\" content=\"JavaScript\">
<meta name=\"vs_targetSchema\" content=\"http://schemas.microsoft.com/ellisense/ie5\">
</HEAD>
<body>
<form id=\"Form1\" method=\"post\" runat=\"server\">
<div align=\"center\"><br/><br/><br/><br/><br/>
<cc1:JSYNetDate id=\"JSYNetDate1\" Length=\"50\" IsNull=\"true\" runat=\"server\"></cc1:JSYNetDate>
<br/>
<asp:Button id=\"Button1\" runat=\"server\" Text=\"Button\"></asp:Button>


</div>
</form>
</body>
</HTML>

Tags:  日期输入控件 vb日期控件 js日期控件 日期控件

延伸阅读

最新评论

发表评论