[筆記] Calendar 選擇同一天時不會觸發 SelectionChanged事件
解決方法
1. 將Calendar控制項預設日期設為1900/01/01
2. 不給你選同一天
3. 同一天註冊Javascript
前言
有A、B兩個網頁,A網頁按下日期選擇按鈕後,會跳出B網頁,提供使用者選擇日期後在將選擇的日期(透過日曆控制項的SelectionChanged事件裡)帶回A網頁欄位中。在測試中發現有一點很特別的,假設A網頁帶給B網頁的日期與B網頁日曆選擇日期是同一天時(就是A網頁日期是2011/6/12,B網頁日曆控制項預設日也是2011/6/12,但B網頁日曆選擇2011/6/12將不會把2011/6/12值回傳給A網頁),檢查後發現,Calendar控件會觸發PostBack事件,但選擇同一天就不會觸發SelectionChanged事件。
處理方式
MSDN Calendar事件中有沒有類似OncClick的事件可以使用。為了要不被發現有bug解決此問題,可以透過下列三種方式解決:
- 將Calendar控制項預設日期設為1900/01/01
- 首先在Page_Load時,將Calendar控制項選擇的日期設為1900/01/01(改預設日期,設定Calendar可以觸發SelectionChanged事件)
- 接下來在Day_DayRender事件中,找到A網頁傳來的日期,設定字體顏色跟背景色,讓使用者認為該日期有被選擇(製造使用者錯覺)
- 完成上述步驟,即使選擇同一天時,也會觸發SelectionChanged事件。請參考下列Code
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
// 預設將選擇日期為1900/1/1
Calendar1.SelectedDate = new DateTime(1900,1,1);
// Arwind 大大提醒還有此方法可以使用
Calendar1.Selected.Clear();
}
}
protected void Calendar1_DayRender(object sender, DayRenderEventArgs e)
{
DateTime mySelectedDate = DateTime.Parse(Request.QueryString["Date"].ToString());
// 設定選擇日期的顏色Style
if (e.Day.Date.ToString("yyyy/MM/dd") == mySelectedDate.ToString("yyyy/MM/dd"))
{
e.Cell.BackColor = System.Drawing.Color.FromName("#6699FF");
e.Cell.ForeColor = System.Drawing.Color.White;
}
}
- 不給你選同一天
- 在Page_Load時,將Calendar控制項選擇的日期設A網頁傳來的日期。
- 在Day_DayRender事件中,找到A網頁傳來的日期,拿掉該日期的連結(e.Cell.Text = e.Day.DayNumberText),讓使用者沒辦法選該日期。
- 請參考下列Code
protected void Page_Load(object sender, EventArgs e) { Calendar1.SelectedDate = DateTime.Parse(Request.QueryString["Date"].ToString()); } protected void Calendar1_DayRender(object sender, DayRenderEventArgs e) { DateTime mySelectedDate = DateTime.Parse(Request.QueryString["Date"].ToString()); // 拿掉同一天的連結 if (e.Day.Date.ToString("yyyy/MM/dd") == mySelectedDate.ToString("yyyy/MM/dd")) { e.Cell.Text = e.Day.DayNumberText; } }
- 同一天註冊Javascript
- 在Page_Load時,將Calendar控制項選擇的日期設A網頁傳來的日期。
- 在Day_DayRender事件中,找到A網頁傳來的日期,註冊Javascript事件,設定如果選到同一天,就透過Javascript 方法將該日期回傳給A網頁(或是直接導回A網頁也可以)。
- 請參考下列Code
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
Calendar2.SelectedDate = DateTime.Parse(Request.QueryString["Date"].ToString());
}
}
protected void Calendar2_DayRender(object sender, DayRenderEventArgs e)
{
DateTime mySelectedDate = DateTime.Parse(Request.QueryString["Date"].ToString());
// 按下同一下就導頁
if (e.Day.Date.ToString("yyyy/MM/dd") == mySelectedDate.ToString("yyyy/MM/dd"))
{
string myReturnJS = string.Format("return Redirect('" + mySelectedDate.ToString("yyyy/MM/dd") + "');");
e.Cell.Attributes.Add("onclick", myReturnJS);
}
}
JS
function Redirect(pSelectedDate) {
location.href = "Default.aspx?Date=" + pSelectedDate;
return false;
}
參考
以上三種方法都可以達到目的,可以根據不同的情況來做運用(個人淺見),如果各位有發現更好的解決方法,麻煩請跟我說一聲,我會在將方法補上,謝謝 :D