【ASP.NET コントロール】カレンダーコントロール(Calendar)

ASP.NETにおけるカレンダー入力に関して

 (1) カレンダーコントロール(Calendar)を利用(★今回★)
  →操作性、実装の難度は、(2)、(3)に落ちるが、カレンダーを独自でカスタマイズできる(休日設定など)
http://blogs.yahoo.co.jp/dk521123/26916160.html
 (2) ASP.NET AJAX Control ToolkitのCalendarExtenderを利用
  →実装も簡単で操作性もいいが、バグあり。(詳細は、以下CalendarExtenderの「使用上の注意」を参照)
http://blogs.yahoo.co.jp/dk521123/25959360.html
 (3) JQuery を利用
  →ユーザーへの入力補助のみを目的なら一番いいと思う。
http://blogs.yahoo.co.jp/dk521123/26923987.html
 ※それぞれの特性などは「カレンダーを利用した実装に関する注意点」を参照のこと。

サンプル

http://japan.internet.com/developer/20051011/25.html
を参考にできる限りポストバックしないカレンダーコントロールを作成する
なお、前月「<<」や次月「>>」押下時のポストバックのちらつきは、updateパネルを使用し解決した。

また、モーダルレスなwindow.open()だと、子画面を開いたまま、親画面を編集できてしまうので、モーダル・window.showModalDialog()で表示する
これについては、以下を参考とする。
http://blogs.yahoo.co.jp/dk521123/27723613.html

WebForm1.aspx(呼び出し元、デザイン部)

<html xmlns="">http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
<script language="javascript" type="text/javascript">
    function showCalendarPicker(textBoxID) {
        var returnValue = window.showModalDialog('CalendarModal.aspx',
         'calendarPopup', 'width=240,height=220,resizable=yes');
        if (returnValue != null) {
            var textObj = document.getElementById(textBoxID);
            textObj.value = returnValue;
        }
    }
</script>
<base target="_self" />
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
    <asp:ImageButton ID="ImageButton1" runat="server" 
        ImageUrl="~/Images/Calendar_scheduleHS.png" />
    </div>
    </form>
</body>
</html>

WebForm1.aspx,vb(呼び出し元、コードビハインド部)

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    Me.ImageButton1.OnClientClick = "showCalendarPicker('" & Me.TextBox1.ClientID & "'); return false;"
End Sub

CalendarModal.aspx(呼び出し先、デザイン部)

<html xmlns="">http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<base target="_self" />
</head>
<body>
    <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server">
    </asp:ScriptManager>
    <div>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <ContentTemplate>
                <asp:Calendar ID="Calendar1" runat="server"></asp:Calendar>
            </ContentTemplate>
        </asp:UpdatePanel>
    </div>
    </form>
</body>
</html>

CalendarModal.aspx.vb(呼び出し先、コードビハインド部)

Protected Sub Calendar1_DayRender(sender As Object, e As System.Web.UI.WebControls.DayRenderEventArgs) Handles Calendar1.DayRender
    ' リンクを全て消す
    e.Cell.Controls.Clear()

    ' リンクを再作成
    Dim link As HtmlGenericControl = _
        New System.Web.UI.HtmlControls.HtmlGenericControl()
    link.TagName = "a"
    link.InnerText = e.Day.DayNumberText
    Dim jscript As String = String.Format( _
        "JavaScript:window.returnValue = '{0:d}'; window.close();", _
        e.Day.Date)
    link.Attributes.Add("href", jscript)

    ' デフォルト値を指定
    If (e.Day.IsSelected) Then

        link.Attributes.Add("style", _
            Me.Calendar1.SelectedDayStyle.ToString())

    End If

    ' リンクを追加
    e.Cell.Controls.Add(link)

End Sub

メモ

選択日付の設定

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Not Me.IsPostBack Then
        Dim textValue = Me.Request.QueryString("TextBoxValue")
        If Not String.IsNullOrEmpty(textValue) Then
            Dim dateValue As Date
            If Date.TryParse(textValue, dateValue) Then
                Me.Calendar1.SelectedDate = dateValue
                Return
            End If
        End If
        Me.Calendar1.SelectedDate = Me.Calendar1.TodaysDate
    End If
End Sub

参考文献

http://aspnet.keicode.com/controls/calendar-set-get.php



使用した技術

 * aタグ押下し、JavaScriptにテキストボックスのIDを渡す際、ASP.NET コントロールの、ClientID プロパティを利用した

onclick="calendarPicker('<%= TextBox1.ClientID %>'
http://dhive.jp/blog/yama/?p=1193

関連記事

ASP.NETでshowModalDialogを使わずに、モーダル表示 ~Step1~

http://blogs.yahoo.co.jp/dk521123/28248646.html

ASP.NET AJAX Control Toolkit (ModalPopupExtender, モーダル編)

http://blogs.yahoo.co.jp/dk521123/folder/982850.html

ASP.NETでshowModalDialog()を利用したモーダルの子画面ダイアログを表示する(1)

http://blogs.yahoo.co.jp/dk521123/27710267.html

ASP.NETでshowModalDialog()を利用したモーダルの子画面ダイアログを表示する(2)

http://blogs.yahoo.co.jp/dk521123/27723613.ht