C#

カレンダーのクリック

CalendarにはSelectionChangedイベントはあるのですが、クリックがありません。選択されている日付をクリックすると当然ながらSelectionChangedイベントは発生しないので、クリックされたというだけのイベントを捕まえられません。

Visual Stadio .NETはページにCalendarを追加すると、同時にhidden属性の__EVENTTARGETと__EVENTARGUMENTという二つの要素を(もしなければ)追加します。サーバ側でRequest.Formコレクションを調べると、この値がわかります。Calendarをクリックすると選択されている日付であっても必ずこの二つに値を設定してサーバに返してきますので、該当オブジェクトかどうかを調べることでCalendarがクリックされたことを検出できます。また、__EVENTARGUMENTの一文字目が'V'であるときは表示月を移動するらしいので、'V'でないときには日付をクリックされたのだとわかります。

    public class SomeForm : System.Web.UI.Page
    {
	    ...

	    private bool IsCalender1Clicked = false;

	    ...

	    private void Page_Load(object sender, System.EventArgs e)
	    {
		    IsCalendar1Clicked =
			    (Request.Form["__EVENTTARGET"] == Calendar1.UniqueID
			    && Request.Form["__EVENTARGUMENT"][0] != 'V');

		    ...
	    }

	    ...
    }

ページでは「Request.Form["__EVENTTARGET"] == "Calendar1"」を確かめてもいいのですが、ユーザーコントロールの中ではUniqueIDと比較する必要があるので、気をつけてください。

クリックは、手間と混乱を省くためCalendarのSelectionChangedイベントは使わずにPreRenderイベントで処理します。PreRenderイベントはSelectionChangedイベントよりもあと、コントロールを描画する(=Responseに出力する)直前で処理されます。Unloadイベントはリソース開放などの後処理をするためにあり、Requestコンテキストはもはや無効で、各コントロールに何か値を設定したりすると例外が発生してしまうので、この場合は適さないでしょう。

    private void Calendar1_PreRender(object sender, System.EventArgs e)
    {
	    if (IsCalendar1Clicked)
	    {
		    // 必要な処理
	    }
    }