C# - 如果相同,则清除所选日历日期

时间:2014-10-24 23:44:07

标签: c# calendar datepicker 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>

2 个答案:

答案 0 :(得分: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,这意味着我们知道点击了不同的日期。如果选择没有改变,则日历不会触发均匀和清除仍为真。

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

我不知道,它有效,但它闻起来。也许有更好的方法吗?虽然Calendar控件似乎不是以这种方式工作的。无论如何,我希望这有帮助!

答案 1 :(得分:0)

 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;
        }