【问题标题】:show only month and year in ajax toolkit calendar extender在 ajax 工具包日历扩展器中仅显示月份和年份
【发布时间】:2013-05-16 22:31:30
【问题描述】:

请帮忙.. 如何在 ajax 日历扩展器中修改日历扩展器显示以仅显示月份和年份,我的意思是日历视图不是文本框文本格式,所以我只选择特定年份的月份名称。

【问题讨论】:

    标签: asp.net vb.net calendarextender


    【解决方案1】:
    <%@ Page Language="vb" AutoEventWireup="false" CodeBehind="TestOnlyChangeMonthAndSetDefaultDay.aspx.vb"
        Inherits="SoluTest_CalendarUserControl.TestOnlyChangeMonthAndSetDefaultDay" %>
    
    
    <%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="cc1" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    
    
        <script type="text/javascript">
    
    
            var cal1;
            var cal2;
    
    
            function pageLoad() {
                cal1 = $find("calendar1");
                cal2 = $find("calendar2");
    
    
                modifyCalDelegates(cal1);
                modifyCalDelegates(cal2);
            }
    
    
            function modifyCalDelegates(cal) {
                //we need to modify the original delegate of the month cell.
                cal._cell$delegates = {
                    mouseover: Function.createDelegate(cal, cal._cell_onmouseover),
                    mouseout: Function.createDelegate(cal, cal._cell_onmouseout),
    
    
                    click: Function.createDelegate(cal, function(e) {
                        /// <summary>
                        /// Handles the click event of a cell
                        /// </summary>
                        /// <param name="e" type="Sys.UI.DomEvent">The arguments for the event</param>
    
    
                        e.stopPropagation();
                        e.preventDefault();
    
    
                        if (!cal._enabled) return;
    
    
                        var target = e.target;
                        var visibleDate = cal._getEffectiveVisibleDate();
                        Sys.UI.DomElement.removeCssClass(target.parentNode, "ajax__calendar_hover");
                        switch (target.mode) {
                            case "prev":
                            case "next":
                                cal._switchMonth(target.date);
                                break;
                            case "title":
                                switch (cal._mode) {
                                    case "days": cal._switchMode("months"); break;
                                    case "months": cal._switchMode("years"); break;
                                }
                                break;
                            case "month":
                                //if the mode is month, then stop switching to day mode.
                                if (target.month == visibleDate.getMonth()) {
                                    //this._switchMode("days");
                                } else {
                                    cal._visibleDate = target.date;
                                    //this._switchMode("days");
                                }
                                cal.set_selectedDate(target.date);
                                cal._switchMonth(target.date);
                                cal._blur.post(true);
                                cal.raiseDateSelectionChanged();
                                break;
                            case "year":
                                if (target.date.getFullYear() == visibleDate.getFullYear()) {
                                    cal._switchMode("months");
                                } else {
                                    cal._visibleDate = target.date;
                                    cal._switchMode("months");
                                }
                                break;
    
    
                            //                case "day":
                            //                    this.set_selectedDate(target.date);
                            //                    this._switchMonth(target.date);
                            //                    this._blur.post(true);
                            //                    this.raiseDateSelectionChanged();
                            //                    break;
                            case "today":
                                cal.set_selectedDate(target.date);
                                cal._switchMonth(target.date);
                                cal._blur.post(true);
                                cal.raiseDateSelectionChanged();
                                break;
                        }
    
    
                    })
                }
    
    
            }
    
    
            function onCalendarShown(sender, args) {
                //set the default mode to month
                sender._switchMode("months", true);
                changeCellHandlers(cal1);
            }
    
    
    
    
            function changeCellHandlers(cal) {
    
    
                if (cal._monthsBody) {
    
    
                    //remove the old handler of each month body.
                    for (var i = 0; i < cal._monthsBody.rows.length; i++) {
                        var row = cal._monthsBody.rows[i];
                        for (var j = 0; j < row.cells.length; j++) {
                            $common.removeHandlers(row.cells[j].firstChild, cal._cell$delegates);
                        }
                    }
                    //add the new handler of each month body.
                    for (var i = 0; i < cal._monthsBody.rows.length; i++) {
                        var row = cal._monthsBody.rows[i];
                        for (var j = 0; j < row.cells.length; j++) {
                            $addHandlers(row.cells[j].firstChild, cal._cell$delegates);
                        }
                    }
    
    
                }
            }
    
    
            function onCalendarHidden(sender, args) {
    
    
                if (sender.get_selectedDate()) {
                    if (cal1.get_selectedDate() && cal2.get_selectedDate() && cal1.get_selectedDate() > cal2.get_selectedDate()) {
                        alert('The "From" Date should smaller than the "To" Date, please reselect!');
                        sender.show();
                        return;
                    }
                    //get the final date
                    var finalDate = new Date(sender.get_selectedDate());
                    var selectedMonth = finalDate.getMonth();
                    finalDate.setDate(1);
                    if (sender == cal2) {
                        // set the calender2's default date as the last day
                        finalDate.setMonth(selectedMonth + 1);
                        finalDate = new Date(finalDate - 1);
                    }
                    //set the date to the TextBox
                    sender.get_element().value = finalDate.format(sender._format);
                }
            }
    
    
        </script>
    
    
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:ScriptManager ID="ScriptManager1" runat="server" />
            From :
            <asp:TextBox ID="TextBox1" runat="server" AutoCompleteType="Disabled"></asp:TextBox>
            <cc1:CalendarExtender ID="CalendarExtender1" BehaviorID="calendar1" runat="server"
                Enabled="True" Format="yyyy/MM/dd" TargetControlID="TextBox1" OnClientShown="onCalendarShown"
                OnClientHidden="onCalendarHidden">
            </cc1:CalendarExtender>
            To :
            <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
            <cc1:CalendarExtender ID="CalendarExtender2" BehaviorID="calendar2" runat="server"
                Enabled="True" Format="yyyy/MM/dd" TargetControlID="TextBox2" OnClientShown="onCalendarShown"
                OnClientHidden="onCalendarHidden">
            </cc1:CalendarExtender>
        </div>
        </form>
    </body>
    </html>
    

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
    【解决方案2】:

    您可以简单地将CalendarExtender 的显示模式更改为月份。

    第 1 步。OnClientShown 事件添加到 CalendarExtender 即。

    <AjaxControlToolkit:CalendarExtender ID="calTitleLength" runat="server" 
    TargetControlID="txtMonth" OnClientShown="calendarShown">    
    </AjaxControlToolkit:CalendarExtender>
    

    第2步。处理OnClientShown事件切换日历ie模式。

    function calendarShown(sender, e) {
    sender._switchMode("months", true); 
    }
    

    【讨论】:

      【解决方案3】:

      显示的 OnClientShown 函数需要做的不仅仅是切换模式。这是我正在使用的解决方案,它只显示月份,您可以选择月份并且只在文本框中显示月份和年份。

      第 1 步

      <asp:CalendarExtender ID="calendar1" ClientIDMode="Static" runat="server"
                            TargetControlID="txtDate" Format="yyyy-MM" 
                            DefaultView="Months" OnClientShown="onCalendarShown"
                            OnClientHidden="onCalendarHidden" PopupButtonID="imgStart" />
      

      请注意:ClientIDMode = 静态,DefaultView = 月份,附加 OnClientShownOnClientHidden 事件。 p>

      您还可以将 Format="yyyy-MM" 更改为您想要的任何格式,其中包含月份和年份。

      第 2 步

      创建这些 Javascript 函数。如果您没有加载 JQuery,请将 $find 更改为 document.getElementById

      <script type="text/javascript">
      
          function onCalendarHidden() {
              var cal = $find("calendar1");
      
              if (cal._monthsBody) {
                  for (var i = 0; i < cal._monthsBody.rows.length; i++) {
                      var row = cal._monthsBody.rows[i];
                      for (var j = 0; j < row.cells.length; j++) {
                          Sys.UI.DomEvent.removeHandler(row.cells[j].firstChild, "click", call);
                      }
                  }
              }
          }
      
          function onCalendarShown() {
      
              var cal = $find("calendar1");
      
              cal._switchMode("months", true);
      
              if (cal._monthsBody) {
                  for (var i = 0; i < cal._monthsBody.rows.length; i++) {
                      var row = cal._monthsBody.rows[i];
                      for (var j = 0; j < row.cells.length; j++) {
                          Sys.UI.DomEvent.addHandler(row.cells[j].firstChild, "click", call);
                      }
                  }
              }
          }
      
          function call(eventElement) {
              var target = eventElement.target;
              switch (target.mode) {
                  case "month":
                      var cal = $find("calendar1");
                      cal._visibleDate = target.date;
                      cal.set_selectedDate(target.date);
                      //cal._switchMonth(target.date);
                      cal._blur.post(true);
                      cal.raiseDateSelectionChanged();
                      break;
              }
          }
      </script>
      

      代码修改自:http://danajaatcse.wordpress.com/2010/06/14/modifying-a-ajax-calender-control-to-operate-with-only-years/

      【讨论】:

      • 完美的解决方案,它对我来说就像一个魅力。感谢您的解决方案。
      • Fookin A!这很容易集成到我的系统中。我不得不使用它两次,所以因为我不太了解 JQuery,所以我只是将函数重命名为更特定于我的领域的东西,但它工作得很好。谢谢!
      【解决方案4】:

      在使用顽固的脚本管理器处理继承页面时,我的 javascript 函数未定义,我最终只是简单地将 CalendarExtender 上“DefaultView”的 html 属性设置为“Months”,如下所示:

      <asp:CalendarExtender ID="dtPickerFrom" runat="server" CssClass="calendarClass" Enabled="true" Format="MMM-yy" PopupButtonID="imgcalendarFileDate" TargetControlID="TextBoxFileDate" DefaultView="Months">
      </asp:CalendarExtender>
      

      以下是相关属性及其选项:

      结果:

      【讨论】:

      • 我用这种方法走得更远,通过使用一些人在这里制定的信息,使控件自动选择所选月份的第一天,抑制需要选择一个月中的一天:@ 987654321@
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-14
      • 2011-01-11
      • 1970-01-01
      • 2020-07-10
      • 2015-08-17
      • 1970-01-01
      相关资源
      最近更新 更多