在ASP.NET Calendar Control中取消选择日期

我正在尝试在C#Web日历控件上选择和取消选择日期。

我遇到的问题是我可以选择或取消选择日期,除非只选择了一个日期。

点击它不会触发选择更改事件,所以我需要在dayrender事件上做一些事情,但我不确定是什么或如何。

编辑:添加了Pre_Render事件代码。 这似乎现在有效,但似乎有点不稳定,例如选择日期A:确定选择日期B:确定取消选择它们:确定选择日期A:不起作用,需要选择它两次取消选择日期A:确定选择日期C:选择日期A和c

@约翰

是的,我知道控件是.NET 2.0框架的一部分,与C#本身无关。

代码到目前为止:

public static List list = new List(); protected void Calendar1_DayRender(object sender, DayRenderEventArgs e) { if (e.Day.IsSelected == true) { list.Add(e.Day.Date); } Session["SelectedDates"] = list; } protected void Calendar1_SelectionChanged(object sender, EventArgs e) { DateTime selection = Calendar1.SelectedDate; if (Session["SelectedDates"] != null) { List newList = (List)Session["SelectedDates"]; foreach (DateTime dt in newList) { Calendar1.SelectedDates.Add(dt); } if (searchdate(selection, newList)) { Calendar1.SelectedDates.Remove(selection); } list.Clear(); } } public bool searchdate(DateTime date, List dates) { var query = from o in dates where o.Date == date select o; if (query.ToList().Count == 0) { return false; } else { return true; } } protected void Calendar1_PreRender(object sender, EventArgs e) { if (Calendar1.SelectedDates.Count == 1) { foreach (DateTime dt in list) { if (searchdate(dt, list) && list.Count == 1) { Calendar1.SelectedDates.Clear(); break; } } } } 

我今天正在寻找这个问题的快速答案,但找不到它,所以我开始寻找自己的解决方案。 即使差不多一年之后我也会把它发布在这里。 (我希望这不违反规则?)

注意:我的代码是在VB而不是C#

我解决这个问题的方法是在页面类中添加一个布尔变量,如下所示:

Dim blnCalendarSelectionChanged As Boolean = False

有了这个,我可以通过在calendar_SelectionChanged方法的开头添加以下内容来跟踪选择是否已更改:

blnCalendarSelectionChanged = True

触发日历SelectionChanged事件后,布尔值才会生效。 如果只剩下一个日期要取消选择,则不会触发SelectionChanged事件。 所以在日历的PreRender上我有以下内容:

 Protected Sub calShift_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles calShift.PreRender If blnCalendarSelectionChanged = False Then If Not IsNothing(Session("SelectedDates")) Then Dim newList As List(Of DateTime) = CType(Session("SelectedDates"), List(Of DateTime)) newList.Remove(calShift.SelectedDate) Session("SelectedDates") = newList calShift.SelectedDate = Nothing End If End If End Sub 

在PreRender中执行此操作非常重要,因为它在DayRender之前执行。 如果您将此代码放入DayRender,那么将从日历中选择日期中删除日期,但日历渲染不会更新,这样会向用户显示日期仍处于选中状态。

有一个问题,我还没有找到解决方法。 日历PreRender在任何控件的回发上执行,因此如果在用户导致来自另一个控件的回发时选择了单个日期,则会导致日历丢失其选择。 在我的情况下,这不是一个问题,但我一直在寻找一种方法来完善它。

这可能不是最好的解决方案,但它对我有用! 🙂