一種監聽DataList中Calendar事件的解決方案

來源:互聯網
上載者:User
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年內



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。