質問する質問する
 

質問CheckBox 付き Calendar コントロール

  • 10 時間 0 分前leereg ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     
    チェックボックス付きのカレンダーを作りたいと思っています。

    Calendar コントロールにて一日ごとにチェックボックスを表示し
    ポストバック後に値を取得しようと考えました。


    以下のように DayRender イベントのイベントデータを使用することにより
    チェックボックスを登録することが出来るようになりました。

    e.Cell.Controls.Add(new
     CheckBox());
    

     

    しかし、別に表示しているボタンによるポストバック後に
    チェックボックスを登録した Cell プロパティにアクセスする方法が分からないため
    チェックボックスにもアクセスすることができません。
    ポストバック後にチェックボックスの値を取得する方法はありますでしょうか?

    よろしくお願いいたします。

    • 編集済みleereg 9 時間 58 分前記述ミス
    •  

すべての返信

  • 9 時間 49 分前SurferOnWww ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     

    昔、検証のために作ったコードですが、以下が参考になりませんか?

    <%@ Page Language="C#" %>
    <%@ Import Namespace="System.Collections.Generic" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <script runat="server">
        protected List<DateTime> checkedDates = new List<DateTime>();

        protected void Calendar1_DayRender(object sender, DayRenderEventArgs e)
        {
            CheckBox cb = new CheckBox();
            cb.ID = e.Day.Date.ToShortDateString();
            string script = String.Format("javascript:__doPostBackOnCheckBoxClick('{0}');", cb.ID);
            cb.Attributes.Add("onclick", script);
            foreach (DateTime day in checkedDates)
            {
                if (e.Day.Date == day)
                {
                    cb.Checked = true;
                    break;
                }
                cb.Checked = false;
            }
            e.Cell.Controls.Add(cb);
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                return;
            }

            object obj = ViewState["CheckedDates"];
            if (obj != null)
            {
                checkedDates = (List<DateTime>)obj;
            }

            foreach (DateTime day in checkedDates)
            {
                if (ClickedCheckBoxID.Value == day.ToShortDateString())
                {
                    checkedDates.Remove(DateTime.Parse(ClickedCheckBoxID.Value));
                    ClickedCheckBoxID.Value = String.Empty;
                    ViewState["CheckedDates"] = checkedDates;
                    return;
                }
            }
           
            if (ClickedCheckBoxID.Value != String.Empty)
            {
                checkedDates.Add(DateTime.Parse(ClickedCheckBoxID.Value));
                ClickedCheckBoxID.Value = String.Empty;
                ViewState["CheckedDates"] = checkedDates;
            }
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            string str = "Selected Dates:";
            foreach (DateTime day in checkedDates)
            {
                str += "<br />" + day.ToShortDateString();
            }
            Label1.Text = str;
        }
    </script>

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title>無題のページ</title>
        <script type="text/javascript">
        //<![CDATA[
            var theForm = document.forms['form1'];
            if (!theForm)
            {
                theForm = document.form1;
            }
            function __doPostBackOnCheckBoxClick(checkBoxID)
            {
                if (!theForm.onsubmit || (theForm.onsubmit() != false))
                {
                    theForm.ClickedCheckBoxID.value = checkBoxID;
                    theForm.submit();
                }
            }
        //]]>
        </script>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <input type="hidden" name="ClickedCheckBoxID" id="ClickedCheckBoxID" value="" runat="server" />
            <asp:Calendar ID="Calendar1" runat="server" ondayrender="Calendar1_DayRender"
                SelectionMode="None" >
            </asp:Calendar>
            <asp:Button ID="Button1" runat="server" Text="チェックした日付を表示"
                onclick="Button1_Click" />
            <br />
            <asp:Label ID="Label1" runat="server"></asp:Label>       
        </div>
        </form>
    </body>
    </html>