如何在Calendar控制項中加入會引發PostBack的控制項並處理其事件

如何在Calendar控制項中加入會引發PostBack的控制項並處理其事件,本文將介紹可能的解決方案。

今天在論壇上有網友提到想要Calendar的DayRender事件中在動態加入LinkButton並處理其Click事件。不過在MSDN中提到下列注意事項:

image

 

如果你直接用下列程式碼來動態產生控制項:

   1:  protected void Calendar1_DayRender(object sender, DayRenderEventArgs e)
   2:  {
   3:      LinkButton lbDynamic = new LinkButton();
   4:      lbDynamic.ID = "LinkButton" + e.Day.Date.ToString("MMdd");
   5:      lbDynamic.Text = "請按此";
   6:      e.Cell.Controls.Add(lbDynamic);
   7:  }

 

會發現所有的LinkButton都無法點選(如下圖):

 

image

 

可以下列程式碼來解決這個問題可以這麼做。首先先在Calendar的DayRender事件中,為LinkButton控制項加入一個href屬性,為原本無法顯示超連結的HTML a Tag加入href屬性,並在點選超連結時執行Client端的__docPostBack方法,該方法接受兩個參數,第一個為控制項的ID,第二個代表要傳遞的參數。

 

   1:  protected void Calendar1_DayRender(object sender, DayRenderEventArgs e)
   2:  {
   3:      LinkButton lbDynamic = new LinkButton();
   4:      lbDynamic.ID = "LinkButton" + e.Day.Date.ToString("MMdd");
   5:      lbDynamic.Text = "請按此";
   6:      // {0}為引發PostBack的控制項ID,{1}參數為要傳遞的參數
   7:      lbDynamic.Attributes.Add("href", string.Format(@"javascript:__doPostBack('{0}','{1}')", "LinkButton"
   8:                                          + e.Day.Date.ToString("MMdd"), "參數=" + e.Day.Date.ToString("MMdd")));
   9:      e.Cell.Controls.Add(lbDynamic);
  10:  }

接著在Page Load事件中利用Request.Form["__EVENTTARGET"]來取得引發PostBack的控制項ID,並搭配string.Contains方法來找出符合的LinkButton(如第4列),找到之後利用Request.Form["__EVENTARGUMENT"]取得參數內容(如第7列),並傳給自訂的LinkButton_Click方法。

 

   1:  protected void Page_Load(object sender, EventArgs e)
   2:  {
   3:      //取得引發PostBack事件的控制項ID
   4:      if (Request.Form["__EVENTTARGET"] != null && Request.Form["__EVENTTARGET"].Contains("LinkButton"))
   5:      {
   6:          //將引發PostBack控制項的參數傳給自訂LinkButton_Click方法。
   7:          LinkButton_Click(Request.Form["__EVENTARGUMENT"]);
   8:      }
   9:  }       

 

最後在自訂的LinkButton_Click事件中處理接收到的LinkButton參數值。

 

   1:  /// <summary>
   2:  /// 處理LinkButton控制項的參數
   3:  /// </summary>
   4:  /// <param name="s"></param>
   5:  void LinkButton_Click(string s)
   6:  {
   7:      //todo : 您的商業邏輯
   8:      Response.Write(s);
   9:  }

點選請按此之後將印出參數=MMdd的資訊,執行結果如下:

 

image

 

PS:使用此方法雖可解決一部份的問題,不過卻無法取得引發PostBack的物件。

 

【參考資料】