分享
 
 
 

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

王朝asp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

有时你想在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年内

iYearBy100Residue = iYearBy100Residue - Year100Array[i];

if(iYearBy100Residue < 0)

{

iYearBy100 = iSign*(i - iYear100Start);

iYearBy100Residue = iYearBy100Residue + Year100Array[i];

break;

}

else if(iYearBy100Residue == 0)

{//100整年

iYearBy100 = iSign*(i - iYear100Start)+1;

iYear = 2000 + iSign*(400*iYearBy400+100*iYearBy100);

return new DateTime(iYear,1,1);

}

}

if(iSign>0)

{

if(iYearBy100==0)

{

iYearBy4 = iYearBy100Residue/Year4; //4年的倍数

iYearBy4Residue = iYearBy100Residue%Year4; //4年的余数

}

else

{

if((iYearBy100Residue-(Year4-1)) == 0) //被100且不被400整除的不是闰年,应减1

{

iYearBy4 = 1; //4年的倍数

iYearBy4Residue = 0; //4年的余数

}

else if((iYearBy100Residue-(Year4-1)) < 0)

{

iYearBy4 = 0; //4年的倍数

iYearBy4Residue = iYearBy100Residue; //4年的余数

}

else

{

iYearBy4 = (iYearBy100Residue-(Year4-1))/Year4+1; //4年的倍数

iYearBy4Residue = (iYearBy100Residue-(Year4-1))%Year4; //4年的余数

}

}

}

else

{

iYearBy4 = iYearBy100Residue/Year4; //4年的倍数

iYearBy4Residue = iYearBy100Residue%Year4; //4年的余数

}

int iYearStart = (YearArray.Length)*(1-iSign)/2-(1-iSign)/2;

int iYearEnd = (YearArray.Length)*(1+iSign)/2-(1-iSign)/2;

int iMonthStart = (MonthArray.Length)*(1-iSign)/2-(1-iSign)/2;

int iMonthEnd = (MonthArray.Length)*(1+iSign)/2-(1-iSign)/2;

iYearResidue = iYearBy4Residue;

if(iYearResidue == 0)

{//4整年

iYear = 2000 + iSign*(400*iYearBy400 + 100*iYearBy100 + 4*iYearBy4);

return new DateTime(iYear,1,1);

}

for(int i=iYearStart; i!=iYearEnd;i=i+iSign)

{//计算年

iYearResidue = iYearResidue - YearArray[i];

if(iYearResidue <= 0)

{//找到年的绝对偏移量,相对于2000年!

iYearIn4 = iSign*(i - iYearStart)+(1-iSign)/2;

iYearResidue = iYearResidue + YearArray[i];

//计算月日

if(i==0)

MonthArray[2] = MonthArray[2] + 1;//考虑闰月

iMonthResidue = iYearResidue;

for(int j=iMonthStart; j!=iMonthEnd; j=j+iSign)

{

iMonthResidue = iMonthResidue-MonthArray[j];

if(iMonthResidue<=0)

{//找到月!

iMonth = j+1;

iDay = iMonthResidue + MonthArray[j]; //偏移量恢复

iDay = iSign*iDay +(1-iSign)/2*MonthArray[j];//计算日

break;

}

}

iDay = iDay + 1; //日期是以1开始,而不是零

if(iDay-MonthArray[iMonth-1] > 0)

{ //检测是否超出该月

iDay = iDay - MonthArray[iMonth-1];

iMonth++;

if(iMonth>12)

{//检测是否超出该年

iMonth =1;

iYearIn4++;

}

}

break;

}

}

iYear = 2000 + iSign*(400*iYearBy400 + 100*iYearBy100 + 4*iYearBy4 + iYearIn4);

return new DateTime(iYear,iMonth,iDay);

}

}

}

在你需要检测的WebForm中,将这个控件拖进来,并在PageLoad里这么写就可以了:

protected Cage.CageCalendar CageCalendar1;

protected System.Web.UI.WebControls.Label Message;

protected System.Web.UI.WebControls.DataList DataList1;

private void Page_Load(object sender, System.EventArgs e)

{

// 在此处放置用户代码以初始化页面

if (!IsPostBack)

{

bindGrid();

}

CageCalendar1.SniffTime = CageCalendar1.GetDateTime(Request.Form,"DataList1","Calendar2");

if(CageCalendar1.SniffTime != new DateTime())

{

string strControlPath =Request.Form["__EVENTTARGET"].Substring(0,Request.Form["__EVENTTARGET"].LastIndexOf(":"))+":TextBox1";

((TextBox)Page.FindControl(strControlPath)).Text = CageCalendar1.SniffTime.ToShortDateString();

((Calendar)Page.FindControl(Request.Form["__EVENTTARGET"])).VisibleDate = CageCalendar1.SniffTime;

}

else

{

Test.Text="没有监听到"+Request.Form["__EVENTTARGET"]+"中的Caledar事件";

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有