【问题标题】:C# - Clear selected calendar date if it is the sameC# - 如果选定的日历日期相同,则清除它
【发布时间】:2014-10-24 23:44:07
【问题描述】:

我的 C# 代码中有一个日历,如果单击同一日期,我希望取消选择某个日期。该怎么做?

protected void SelectionChangeCalendar(Object sender, EventArgs e){

   selected_date = Calendar1.SelectedDate.ToShortDateString();

   if(same date is clicked){
      Calendar1.SelectedDates.Clear();
   }

}

这里的问题是,我相信如果选择了相同的日期,“SelectionChangeCalendar”不会被触发。

标记:

<asp:Calendar ID="Calendar1" runat="server" OnSelectionChanged="SelectionChangeCalendar"></asp:Calendar>

【问题讨论】:

  • 为什么不在日历控件旁边有一个清除选择的按钮,选择相同日期时清除日历值不是很直观。

标签: c# datepicker calendar


【解决方案1】:

编辑:添加标记

编辑:包含来自 yazanpro 的修复

您是正确的,如果您单击已选择的日期,则 OnSelectionChanged 事件不会触发。但是,它确实会回发事件目标和事件参数,就像它是一个不同的日期一样,因此您可以检查表单参数,然后从那里开始。诀窍是,如果您检查页面加载,然后清除所选日期,您最终会触发 OnSelectionChanged 事件,并且日期会再次被选中。但是,如果您等到日历处理完回发数据并确定没有更改后,您可以成功清除日期。这是我用来让它工作的代码:

public partial class WebForm1 : System.Web.UI.Page
{
    bool clear = true;

    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void Calendar1_SelectionChanged(object sender, EventArgs e)
    {
        //if we are here, the date actually changed, so set clear to false
        clear = false;
    }

    protected void Calendar1_PreRender(object sender, EventArgs e)
    {
        //if clear is true and the event target is the calendar and a date was clicked
        if (clear  
            && !string.IsNullOrEmpty(Request.Form["__EVENTTARGET"])
            && Request["__EVENTTARGET"].Contains(Calendar1.ID)
            && char.IsDigit(Request.Form["__EVENTARGUMENT"][0]))
        {
            Calendar1.SelectedDates.Clear(); //clear the date
        }
    }

}

标记:

<asp:Calendar ID="Calendar1" runat="server" OnPreRender="Calendar1_PreRender" OnSelectionChanged="Calendar1_SelectionChanged"></asp:Calendar>

clear 变量只是跟踪日期是否实际更改。如果是,则 OnSelectionChanged 事件将触发,我们知道我们不必清除任何日期。步骤如下:

1) 当页面回发时,如果事件目标是日历,日历会检查发布数据以查看选择是否已更改。如果有,它会调用事件处理程序并设置clear = false,这意味着我们知道点击了不同的日期。如果选择没有改变,Calendar 不会触发 even 并且 clear 保持为真。

2) 处理完事件后,我们使用 prerender 事件来检查事件目标是否是日历。如果是这样,并且 clear 仍然为 true,那么我们知道单击了选定的日期或日历控件之一。事实证明,如果单击控件,则事件参数以字母开头。如果单击日期,则它以数字开头(参数是自 2000 年 1 月 1 日以来的天数)。所以我们要做的就是检查事件参数的第一个字符是否是数字,以查看当前选择的日期是否被点击。如果是这样,我们清除日期并完成。

我不知道,它有效,但它闻起来很香。也许有更好的方法来做到这一点?似乎日历控件并非设计为以这种方式工作。无论如何,我希望这会有所帮助!

【讨论】:

  • 请记住,拥有母版页会使您的条件无法满足,因为 Calendar1 ID 将不同于“Calendar1”。最好将其替换为:if (clear &amp;&amp; !string.IsNullOrEmpty(Request.Form["__EVENTTARGET"]) &amp;&amp; Request["__EVENTTARGET"].Contains(Calendar1.ID) &amp;&amp; char.IsDigit(Request.Form["__EVENTARGUMENT"][0]))
  • Calendar1_PreRender 是如何被解雇的?我按照你的解释做了,但它没有清除,似乎没有启动。我应该在标记中包含什么?
  • 在网格标记中包含OnPreRender = "Calendar1_PreRender"
  • yazanpro 明白了。我已将其添加到答案中。
  • 我会尽快测试它,如果它有效,我会告诉你。感谢到目前为止所做的一切。
【解决方案2】:
 protected void Calendar1_SelectionChanged(object sender, EventArgs e)
        {
            //Check if selected Date is in the saved list
            // Remove the Selected Date from the saved list
            if (SelectedDates.Contains(Calendar1.SelectedDate))
                SelectedDates.Remove(Calendar1.SelectedDate);
            else
                SelectedDates.Add(Calendar1.SelectedDate);
            ViewState["Dates"] = SelectedDates;
        }

【讨论】:

    猜你喜欢
    • 2012-09-01
    • 1970-01-01
    • 2012-03-15
    • 2021-11-12
    • 1970-01-01
    • 2021-02-28
    • 2023-04-05
    • 2021-08-12
    • 1970-01-01
    相关资源
    最近更新 更多