创建下拉式日期选择控件
一、页面设计
页面设计很简单,新建一个Web User Control(以下简称WUC),放三个DropDownList,分别取名为Year,Month,Day.然后写三个字:年,月,日.
二、后台代码
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
//填充DropDownList
int i = 0;
Year.Items.Clear();
for (i = 1900; i <= DateTime.Now.Year; i++)
{
ListItem item = new ListItem(i.ToString(), i.ToString());
Year.Items.Add(item);
}
Month.Items.Clear();
for (i = 1; i <= 12; i++)
{
string t = i < 10 ? "0" + i.ToString() : i.ToString();
ListItem item = new ListItem(t, i.ToString());
Month.Items.Add(item);
}
Day.Items.Clear();
for (i = 1; i <= 31; i++)
{
string t = i < 10 ? "0" + i.ToString() : i.ToString();
ListItem item = new ListItem(t, i.ToString());
Day.Items.Add(item);
}
//给年和月的onchange 绑定方法,用于处理闰年的情况
Year.Attributes["onchange"] = "OnSelectChange(" + Year.ClientID + "," + Month.ClientID + "," + Day.ClientID +");";
Month.Attributes["onchange"] = "OnSelectChange(" + Year.ClientID + "," + Month.ClientID + "," + Day.ClientID +");";
Year.SelectedValue = DateTime.Now.Year.ToString();
Month.SelectedValue = DateTime.Now.Month.ToString();
Day.SelectedValue = DateTime.Now.Day.ToString();
}
}
//公共属性,用于获取设置整个控件的日期值
public DateTime Date
{
get { return DateTime.Parse(Year.SelectedValue+"-"+Month.SelectedValue+"-"+Day.SelectedValue); }
set
{
Year.SelectedValue = value.Year.ToString();
Month.SelectedValue = value.Month.ToString();
Day.SelectedValue = value.Day.ToString();
}
}
三、(重点)Javascript脚本代码
//!----放在ascx文件中------------------
//下面的代码是用于处理闰年的情况
var bigArray=new Array(1,3,5,7,8,10,12);
function OnSelectChange(year,month,day)
{
if(month.value==2)//选中的月份为2月
{
if(checkYear(year.value))//闰年
{
fillDay(day,29);
}
else
{
fillDay(day,28);
}
}
else
{
if(inArray(month.value,bigArray))
{
fillDay(day,31);
}
else
{
fillDay(day,30);
}
}
}
function checkYear(year)
{
return (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) ? 1 : 0;
}
function fillDay(day,days)
{
while(day.options.length>0)
{
day.remove(0);
}
for(i=1;i<=days;i++)
{
var oOption=document.createElement("OPTION");
if(i<10)
{
oOption.innerText="0"+i;
}
else
{
oOption.innerText=i;
}
oOption.value=i;
day.appendChild(oOption);
}
}
function inArray(oObj,oArray)
{
for(i=0;i<oArray.length;i++)
{
if(oObj==oArray[i])
{
return true;
}
}
return false;
}
//下面的代码比较难理解,不过是最重要的(还是在ascx文件中)
eval("function <%=this.ClientID %>() { this.getDateValue=<%=this.ClientID %>getDateValue;}");
eval("function <%=this.ClientID %>getDateValue() { return new Date(document.all.<%=Year.ClientID %>.value,document.all.<%=Month.ClientID %>.value,document.all.<%=Day.ClientID %>.value);}");
代码说明:
由于种种原因(比如使用了MasterPage,或者GridView中的模版列),一个控件在设计时的ID往往不同于生成页面后的ID,为了获得一个
控件客户端ID,我们可以在Javascript中插入如下代码<%=control.ClientID>来获得其客户端ID。
但是如果想要得到ID的control是一个WUC的话,当生成页面后尽管能得到其ClientID,但是却得不到这个对象,所以也就不能设置或
获得其属性了。
比如,我要做的这个控件,由三个DropDownList组成,可是我却想得到一个完整的日期值(指在客户端),一种思路是先获得三个
DropDownList的ClientID,然后再由ID1.value+ID2.value+ID3.value取得,可是如果你一个页面上需要放多个这样的WUC的话,你需要取得
多少个ClientID?显然这样做的话,工作量会很大,而且要操作众多的对象,很容易出错。
于是,我想了另外一个思路,Javascript允许创建自己的"类"(对象),那么我就把整个控件看作一个类,然后提供一个方法,用于
获得其子控件组合后的一个日期值。在处理技巧上,我把这个类命名为整个WUC的ClientID.伪代码如下:
//!---下面的代码写在ascx文件中,由于涉及执行字符串中的代码,所以用了eval()----------
//!---eval()的用法去参考Javascript教程----------------------
//定义一个"类"
function 控件的ClientID()
{
//声明一个方法
this.getDateValue=getDateValue;
}
//定义要调用的方法
function getDateValue(子控件1的ClientID,子控件2的ClientID,子控件3的ClientID)
{
return 子控件组合后的日期值;
}
//!--------------下面的代码写在aspx页面中---------------------
//在生成页面的脚本中使用这个"类"
var birthday=new 控件的ClientID;
birthday=birthday.getDateValue();
象上面这么做会出现一个新的问题,如果放了多个WUC,那么就会生成一些重名的函数,如果这些函数中不操作具体页面上的对象
倒也无所谓,可是象getDateValue(子控件1的ClientID,子控件2的ClientID,子控件3的ClientID)这样的函数,每个WUC的
子控件的ClientID是不同的,如果存在重名函数的话,会出现某一个被调多次,另一个不被调用的情况。所以要对每一个
WUC产生的getDateValue函数重新命名。每个WUC的ClientID是不同,如果给这些方法名前面再加上一个ClientID,
那么这些控件就能各自调用各自产生的函数了。修改如下:
//定义一个"类"
function 控件的ClientID()
{
//声明一个方法
this.getDateValue=控件的ClientID+getDateValue;
}
//定义要调用的方法
function 控件的ClientID+getDateValue(子控件1的ClientID,子控件2的ClientID,子控件3的ClientID)
{
return 子控件组合后的日期值;
}
而在aspx页面中调用的代码不用更改,仍然是:
var birthday=new 控件的ClientID;
birthday=birthday.getDateValue();
测试一下吧。往一个页面上放三个这样的控件wuc1,wuc2,wuc3
调用如下:
var date1=new <%=wuc1.ClientID>;
date1=date1.getDateValue();
var date2=new <%=wuc2.ClientID>;
date2=date2.getDateValue();
var date3=new <%=wuc3.ClientID>;
date3=date3.getDateValue();
怎么样,是不是很方便????