C#-如果选定的日历日期相同,则清除该日期

C#-如果选定的日历日期相同,则清除该日期,c#,datepicker,calendar,C#,Datepicker,Calendar,我的C#代码中有一个日历,如果单击同一日期,我希望取消选择日期。怎么做 protected void SelectionChangeCalendar(Object sender, EventArgs e){ selected_date = Calendar1.SelectedDate.ToShortDateString(); if(same date is clicked){ Calendar1.SelectedDates.Clear(); } } 这里的问

我的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>

编辑:添加了标记

编辑:包括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
,这意味着我们知道单击了不同的日期。如果选择未更改,日历将不会触发“均匀”和“清除”选项,并保持为真

2) 处理事件后,我们使用prerender事件检查事件目标是否为日历。如果是,且clear仍然为真,则我们知道已单击所选日期或其中一个日历控件。事实证明,如果单击控件,则事件参数以字母开头。如果单击了日期,则它以数字开头(参数是自2000年1月1日起的天数)。因此,我们所要做的就是检查事件参数的第一个字符是否是数字,以查看是否单击了当前选定的日期。如果是这样的话,我们就把日期搞定了


我不知道,它管用,但闻起来很香。也许有更好的办法?日历控件似乎不是按这种方式设计的。不管怎样,我希望这有帮助

为什么不在日历控件旁边设置一个按钮来清除所选内容呢?选择同一日期时清除日历值不是很直观。请记住,拥有母版页会使您的条件无法满足,因为Calendar1 ID与“Calendar1”不同。最好将其替换为:
if(clear&&!string.IsNullOrEmpty(Request.Form[“\uuuu EVENTTARGET]”)和&Request[“\uu EVENTTARGET]”。Contains(Calendar1.ID)和&char.IsDigit(Request.Form[“\uu EVENTARGUMENT”][0])
Calendar1\u PreRender是如何触发的?我照你解释的做了,但天还没亮,似乎也没亮起来。我应该包括在标记中的任何内容?在网格中包括
OnPreRender=“Calendar1\u PreRender”
,markupyazanpro已经知道了。我已经将它添加到了答案中。我将很快测试它,并会让您知道它是否有效。谢谢你到目前为止所做的一切。
 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;
        }