只有累積,沒有奇蹟

2018年8月7日 星期二

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

前言
    有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
  1. protected void Page_Load(object sender, EventArgs e)
  2. {
  3. if (!IsPostBack)
  4. {
  5. // 預設將選擇日期為1900/1/1
  6. Calendar1.SelectedDate = new DateTime(1900,1,1);
  7.      // Arwind 大大提醒還有此方法可以使用
  8.      Calendar1.Selected.Clear();
  9. }
  10. }
  11. protected void Calendar1_DayRender(object sender, DayRenderEventArgs e)
  12. {
  13. DateTime mySelectedDate = DateTime.Parse(Request.QueryString["Date"].ToString());
  14. // 設定選擇日期的顏色Style
  15. if (e.Day.Date.ToString("yyyy/MM/dd") == mySelectedDate.ToString("yyyy/MM/dd"))
  16. {
  17. e.Cell.BackColor = System.Drawing.Color.FromName("#6699FF");
  18. e.Cell.ForeColor = System.Drawing.Color.White;
  19. }
  20. }

  • 不給你選同一天
  1. 在Page_Load時,將Calendar控制項選擇的日期設A網頁傳來的日期。
  2. 在Day_DayRender事件中,找到A網頁傳來的日期,拿掉該日期的連結(e.Cell.Text = e.Day.DayNumberText),讓使用者沒辦法選該日期。
  3. 請參考下列Code

  1. protected void Page_Load(object sender, EventArgs e)
  2. {
  3. Calendar1.SelectedDate = DateTime.Parse(Request.QueryString["Date"].ToString());
  4. }
  5.  
  6. protected void Calendar1_DayRender(object sender, DayRenderEventArgs e)
  7. {
  8. DateTime mySelectedDate = DateTime.Parse(Request.QueryString["Date"].ToString());
  9.  
  10. // 拿掉同一天的連結
  11. if (e.Day.Date.ToString("yyyy/MM/dd") == mySelectedDate.ToString("yyyy/MM/dd"))
  12. {
  13. e.Cell.Text = e.Day.DayNumberText;
  14. }
  15. }
  • 同一天註冊Javascript 
  1. 在Page_Load時,將Calendar控制項選擇的日期設A網頁傳來的日期。
  2. 在Day_DayRender事件中,找到A網頁傳來的日期,註冊Javascript事件,設定如果選到同一天,就透過Javascript 方法將該日期回傳給A網頁(或是直接導回A網頁也可以)。
  3. 請參考下列Code
  1. protected void Page_Load(object sender, EventArgs e)
  2. {
  3. if (!IsPostBack)
  4. {
  5. Calendar2.SelectedDate = DateTime.Parse(Request.QueryString["Date"].ToString());
  6. }
  7. }
  8. protected void Calendar2_DayRender(object sender, DayRenderEventArgs e)
  9. {
  10. DateTime mySelectedDate = DateTime.Parse(Request.QueryString["Date"].ToString());
  11. // 按下同一下就導頁
  12. if (e.Day.Date.ToString("yyyy/MM/dd") == mySelectedDate.ToString("yyyy/MM/dd"))
  13. {
  14. string myReturnJS = string.Format("return Redirect('" + mySelectedDate.ToString("yyyy/MM/dd") + "');");
  15. e.Cell.Attributes.Add("onclick", myReturnJS);
  16. }
  17. }
JS
  1. function Redirect(pSelectedDate) {
  2. location.href = "Default.aspx?Date=" + pSelectedDate;
  3. return false;
  4. }
參考
以上三種方法都可以達到目的,可以根據不同的情況來做運用(個人淺見),如果各位有發現更好的解決方法,麻煩請跟我說一聲,我會在將方法補上,謝謝 :D

Related Posts:

  • [AWS] 使用 AWS SDK上傳檔案到 AWS S3前言 最近在與第三方做串接時,有個需求是要將圖片存起來放在 Application Server 上,與同事討論建議將圖片放在AWS S3 上,多年前有微軟剛推出 Azure 時有接觸過一些,但這幾年隨著年紀增長早已忘光光,這篇簡單紀錄 C# 透過 AWS SDK 將圖片上傳到 AWS S3 上的步驟與要注意的細節 AWS S3  Amazon Simple Storage Service 功能簡稱 S3,是Amazon的物件儲存服務,… Read More
  • [.NET] ASP.NET Application 概述 ASP.NET 處理請求的兩個步驟 當用戶發送一個請求到IIS(這裡指IIS 5.0 & IIS 6.0),ASP.NET 處理請求的步驟有兩種 1. 建立一個可以處理用戶端傳來請求Request的環境(ASP.NET Environment),包括建立application object(應用程式)、Ruquest、Response、Context Object等物件來處理此Ruquest請求。 2. 環境被建立後,應用程式會透過m… Read More
  • [.NET] 無法載入檔案或組件 'Newtonsoft.Json' 或其相依性的其中之一 (發生例外狀況於 HRESULT: 0x80131040)問題 接獲同事報案,反應在測試環境出現以下錯誤訊息 無法載入檔案或組件 'Newtonsoft.Json, Version=11.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' 或其相依性的其中之一。 找到的組件資訊清單定義與組件參考不符。 (發生例外狀況於 HRESULT: 0x80131040) ,實際專案底下 bin 資料夾該 dll 是存在的,心想這問題… Read More
  • [C#] Anonymous Type 匿名型別說明 Anonymous Type 是甚麼? 匿名型別是C# 3.0開始有的特性,是一種暫存型的型別,不需要建立額外的類別來存放資料 根據MSDN對於 匿名型別 的說明如下 根據MSDN的說明,整理一下重點及特性 1. 透過 new 建立實體  // Anonymous Typevar employee = new { Id = 1, Name = "Marcus", Age = 22 } … Read More
  • [.NET] 如何取得 Enum 的 Description 描述字串前言  列舉類型 Enum 在 C# 很常用的一種類型,所允許的型別必須是byte、sbyte、short、ushort、int、uint、long、ulong,在使用上沒特別指定的話基本類型是 int,對我自己來說在程式中使用 Enum 而不用 int 的好處是 Code 閱讀上比較清晰,舉例來說在閱讀代碼時第一段代碼使用 Enum 更容易讓人好懂些 if (code == ResponseCode.OK) //… Read More

0 意見:

張貼留言

Copyright © 2025 m@rcus 學習筆記 | Powered by Blogger

Design by Anders Noren | Blogger Theme by NewBloggerThemes.com