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拡張するために
* 以下の技術が役に立つかも。http://www.atmarkit.co.jp/fdotnet/dotnettips/277aspcalceldata/aspcalceldata.html
http://www.atmarkit.co.jp/fdotnet/dotnettips/337aspcalendarsel/aspcalendarsel.html
http://asp35.com/aspDataGrid3/Chapter1/ch1-04.aspx
http://atamoco.boy.jp/asp/20100814_3.php
http://atamoco.boy.jp/asp/20100814_3.php
Calendarコントロールに独自のツールチップを表示する
http://asp35.com/Samples/080804VB-1.aspx使用した技術
* aタグ押下し、JavaScriptにテキストボックスのIDを渡す際、ASP.NET コントロールの、ClientID プロパティを利用した onclick="calendarPicker('<%= TextBox1.ClientID %>'http://dhive.jp/blog/yama/?p=1193