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

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年内

时间: 2025-01-13 14:33:51

一种监听DataList中Calendar事件的解决方法的相关文章

ff下JQuery无法监听input的keyup事件的解决方法_jquery

复制代码 代码如下: $(document).ready(function(){    $('#news_title').bind('input',fun).bind('keyup',fun);}); //function listvar fun=function(){    value=$(this).val();    $('.prev').text(value);} 注: bind('input',fun)  用于ff下keyup bind('keyup',fun) 用于ie

Android开发-之监听button点击事件的多种方法_Android

 在Android下,事件的发生是在监听器下进行,android系统可以响应按键事件和触摸屏事件,本文主要介绍了button点击事件的方法 一.实现button点击事件的方法 实现button点击事件的监听方法有很多种,这里总结了常用的四种方法: 1.匿名内部类 2.外部类(独立类) 3.实现OnClickListener接口 4.添加XML属性 每一种方法都有它的优点也有它的不足,那么接下来就来详细的讲解这四个实现方法  二.具体实现 1.匿名内部类: 在Android开发中我们会经常看到各种

Android开发-之监听button点击事件的多种方法

在Android下,事件的发生是在监听器下进行,android系统可以响应按键事件和触摸屏事件,本文主要介绍了button点击事件的方法 一.实现button点击事件的方法 实现button点击事件的监听方法有很多种,这里总结了常用的四种方法: 1.匿名内部类 2.外部类(独立类) 3.实现OnClickListener接口 4.添加XML属性 每一种方法都有它的优点也有它的不足,那么接下来就来详细的讲解这四个实现方法 二.具体实现 1.匿名内部类: 在Android开发中我们会经常看到各种匿名

java监听-java中匿名类作为一个方法的参数的时候是不是默认返回一个匿名对象

问题描述 java中匿名类作为一个方法的参数的时候是不是默认返回一个匿名对象 java中匿名类作为一个方法的参数的时候是不是默认返回一个匿名对象 比如用在监听方法当中作为参数的时候 解决方案 可以这么理解,通常是创建一个匿名类的实例然后作为参数传递给指定方法 . 解决方案二: 匿名类,作为参数是返回相应的匿名对象. 具体还是要看调用的函数有参数要求吧,参数是一个对应的匿名类,或者其父类,使用它就没有问题.

JavaScript 监听textarea中按键事件_javascript技巧

有个textarea, Java代码 复制代码 代码如下: <textarea id="text"></textarea> 经常会定义onKeyPress="keypress();",并定义以下方法. 复制代码 代码如下: var keypress = function(e){ var e = e || window.event; var k = e.keyCode; } 这里我使用的办法是JQuery. 复制代码 代码如下: $("

深入浅析JavaScript中对事件的三种监听方式_javascript技巧

事件(Event)是JavaScript应用跳动的心脏,也是把所有东西粘在一起的胶水,当我们与浏览器中Web页面进行某些类型的交互时,事件就发生了. 第一种监听方式,也是最普遍使用的方式,是直接在代码上加载事件,产生效果: <table> <tr onmouseover='this.style.backgroundColor="red"' onmouseout='this.style.backgroundColor=""'><td>

能不能在listview中监听插入删除的事件?

问题描述 能不能在listview中监听插入删除的事件? 能不能在listview中监听插入删除的事件?怎么在listview修改的时候发消息出去给主界面? 解决方案 ListView的监听事件ListView事件监听Listview监听事件的随笔.... 解决方案二: listview监听删除事件应该是监听适配器布局里面的某个控件吧,删除操作成功后,调用activity或者fragment请求数据的代码方法 重新给listview赋值就好了啊

javaweb-Extjs2.0.2中 监听file的change事件是怎么回事

问题描述 Extjs2.0.2中 监听file的change事件是怎么回事 var form = new Ext.form.FormPanel({ renderTo:'file', labelAlign: 'right', labelWidth: 60, frame:true, autoWidth: true, height:200, fileUpload: true, items: [{ xtype: 'textfield', fieldLabel: '文件名', listeners : {

JAVA之旅(三十一)——JAVA的图形化界面,GUI布局,Frame,GUI事件监听机制,Action事件,鼠标事件

JAVA之旅(三十一)--JAVA的图形化界面,GUI布局,Frame,GUI事件监听机制,Action事件,鼠标事件 有段时间没有更新JAVA了,我们今天来说一下JAVA中的图形化界面,也就是GUI 一.GUI的概述 GUI全称叫做Graphical User Intergace(图形用户接口),用图形的方式,来显示计算机操作的界面,这样更加方便直观,与用户交互 说道交互,其实系统跟用户有两种交互,一种是GUI,一种叫做CLI,也就是命令行,全称叫做Command User Intergace