[筆記] Calendar 選擇同一天時不會觸發 SelectionChanged事件

[筆記] 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
  1. 首先在Page_Load時,將Calendar控制項選擇的日期設為1900/01/01(改預設日期,設定Calendar可以觸發SelectionChanged事件)
  2. 接下來在Day_DayRender事件中,找到A網頁傳來的日期,設定字體顏色跟背景色,讓使用者認為該日期有被選擇(製造使用者錯覺)
  3. 完成上述步驟,即使選擇同一天時,也會觸發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;
    }
}

 

  • 不給你選同一天
  1. 在Page_Load時,將Calendar控制項選擇的日期設A網頁傳來的日期。
  2. 在Day_DayRender事件中,找到A網頁傳來的日期,拿掉該日期的連結(e.Cell.Text = e.Day.DayNumberText),讓使用者沒辦法選該日期。
  3. 請參考下列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 
  1. 在Page_Load時,將Calendar控制項選擇的日期設A網頁傳來的日期。
  2. 在Day_DayRender事件中,找到A網頁傳來的日期,註冊Javascript事件,設定如果選到同一天,就透過Javascript 方法將該日期回傳給A網頁(或是直接導回A網頁也可以)。
  3. 請參考下列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

Calendar 成員

Calendar SelectionChanged

Calendar的SelectionChanged 事件