一种监听DataList中Calendar事件的解决方法

80酷酷网    80kuku.com

  calendar|解决有时你想在DataList的编辑模板项中加入在DataList的模板中加入System.Web.UI.WebControls.Calendar,这样你可以通过Calendar来更改日期属性,只需一点,就行了,不需要用户填写固定格式的日期.可是在DataList中System.Web.UI.WebControls.Calendar控件,点击Calendar,是无法响应SelectDate事件的.它只是进行简单的提交,不会出发ItemCreated,ItemBound,select,edit,update,cancel等等DataList时间.(可能有,可是俺没找到)这就是本贴想要解决的问题.
我先前在这个版找了一下,没看见有人讨论这个问题,当然这个如果使用客户端控件应该可以解决.不过我这个人比较固执,不想用梅花雨,自己做了一个服务器端的控件,来解析DataList中Calendar提交表单的参数(主要就是form["__EVENTARGUMENT"]和form["__EVENTTARGET"]这两个表单隐藏域),并将结果保存在这个控件中,这样在稍后就可以访问到了.

我把解决代码贴在下面,希望大家多拍砖,多给点意见,我也好有所提高!:)

监听Calendar控件的控件CageCalendar.dll
using System;
using System.Web.UI.WebControls;
using System.Collections.Specialized;

namespace Cage
{
/// <summary>
/// CageCalendar用于检测客户端Canlendar的SelectedDate事件,通过检测Form中__EVENTARGUMENT和
/// __EVENTTARGET的这两个表单隐藏域,返回相应Canlendar控件中所选择的日期。本控件主要用于
/// DataList和DataGrid中的Calendar响应事件的处理,Cage因而得名。
/// </summary>
public class CageCalendar : System.Web.UI.Control
{
private DateTime dtSniffTime;
public CageCalendar()
{

}
//保存解析的日期,这样使属性能够保存在ViewState中
public DateTime SniffTime
{
get
{
return dtSniffTime;
}
set
{
dtSniffTime = value;
}
}

///通过相对2000年1月1日的日偏移量,返回相应的时间对象
///原理:检测表单中得__EVENTARGUMENT和__EVENTTARGET这两个表单隐藏域,如果合法,将解析后得参数传给帮助类
///返回日期,如果不合法,返回new DateTime()了事
///NameValueCollection form:Web表单的属性集
///string strFindControlPath:需要进行搜索的DataList控件路径
///string strCalendarName:需要进行监听的Calendar控件名
public DateTime GetDateTime(NameValueCollection form,string strFindControlPath,string strCalendarName)
{
if(form["__EVENTARGUMENT"] != null &&
form["__EVENTTARGET"] != null &&
form["__EVENTARGUMENT"] != "" &&
form["__EVENTTARGET"] != "" )
{
char[] cSplitArray = {':'};
string[] strPath = form["__EVENTTARGET"].ToString().Split(cSplitArray);

string strTempPath = form["__EVENTTARGET"].Substring(0,form["__EVENTTARGET"].LastIndexOf(":"));
strTempPath = strTempPath.Substring(0,strTempPath.LastIndexOf(":"));
string strTempCalendarName = form["__EVENTTARGET"].Substring(form["__EVENTTARGET"].LastIndexOf(":")+1);

if(strTempCalendarName!=strCalendarName)//不是想要找的Calendar控件
return new DateTime();
if(strTempPath!=strFindControlPath)//不是想要找的控件路径
return new DateTime();

if(form["__EVENTARGUMENT"].Substring(0,1)!="V")
{
return GetDateTime(Convert.ToInt32(form["__EVENTARGUMENT"]));
}
else
{//翻页
return new DateTime();
}
}

return new DateTime();
}

///通过相对2000年1月1日的日偏移量,返回相应的时间对象
///原理:根据偏移量计算相应的日期,2000年1月1日的日偏移量为0,往后是正数,往前是负数
///天数是每400年为一个周期,这是由闰年造成的
///闰年是或被400被整除 或 被4整除但不被100整除的年份
public DateTime GetDateTime(int iPos)
{
int iSign = 1;
if(iPos < 0)
{
iSign = -1;
iPos = (-1) *iPos;
}

int Year4 = (365*4+1); //一般4年的天数
int Year400 = Year4*100-3; //400年的天数,周期
int[] Year100Array ={Year4*25,Year4*25-1,Year4*25-1,Year4*25-1};//400年中,每100年的天数
int[] MonthArray = {31,28,31,30,31,30,31,31,30,31,30,31}; //12月中一般的天数
int[] YearArray = {366,365,365,365}; //4年中一般的天数

int iYearBy400 = iPos/Year400; //400年的倍数
int iYearBy400Residue = iPos%Year400; //400年的余数
int iYearBy100 = 0; //100年的倍数
int iYearBy100Residue = 0; //100年的余数
int iYearBy4 = 0; //4年的倍数
int iYearBy4Residue = 0; //4年的余数
int iYearIn4 = 0; //4年这一小段中所处的年
int iYearResidue = 0; //4年这一小段中在所处的年的天的余数
int iYear=0; //年
int iMonth=0; //月
int iDay=0; //日
int iMonthResidue = 0; //月中的偏移量

if(iYearBy400Residue == 0)
{//400整年
iYear = 2000 + iSign*400*iYearBy400;
return new DateTime(iYear,1,1);
}

int iYear100Start = (Year100Array.Length)*(1-iSign)/2-(1-iSign)/2;
int iYear100End = (Year100Array.Length)*(1+iSign)/2-(1-iSign)/2;

iYearBy100Residue = iYearBy400Residue;
for(int i=iYear100Start; i!=iYear100End;i=i+iSign)
{//计算在哪个100年内

分享到
  • 微信分享
  • 新浪微博
  • QQ好友
  • QQ空间
点击: