如何在Calendar控制項中加入會引發PostBack的控制項並處理其事件,本文將介紹可能的解決方案。
今天在論壇上有網友提到想要Calendar的DayRender事件中在動態加入LinkButton並處理其Click事件。不過在MSDN中提到下列注意事項:
如果你直接用下列程式碼來動態產生控制項:
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都無法點選(如下圖):
可以下列程式碼來解決這個問題可以這麼做。首先先在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的資訊,執行結果如下:
PS:使用此方法雖可解決一部份的問題,不過卻無法取得引發PostBack的物件。
【參考資料】
- Calendar.OnDayRender 方法
- http://www.xdevsoftware.com/blog/post/Add-LinkButton-to-Calendar-Cell-ASPNET.aspx,John Mendez
- http://forums.asp.net/t/1116063.aspx/1?Add+linkbutton+dynamically+in+calendar+dayrender+event
- Get control name in Page_Load event which make the post back
- [動態建立控制項] Calendar 動態產生子控制項的 Event Handler,ASP.NET魔法學院