Сегодня я искал быстрый ответ на эту проблему, но не смог найти его, поэтому решил найти собственное решение.Я опубликую это здесь, даже если это будет почти год спустя.(Надеюсь, это не противоречит правилам?)
Примечание: мой код был на VB, а не на C #
Моим решением этой проблемы было добавление логической переменной в мой класс страницы, напримерИтак:
Dim blnCalendarSelectionChanged As Boolean = False
Благодаря этому я могу отслеживать, изменился ли выбор, добавив следующее в начало метода calendar_SelectionChanged:
blnCalendarSelectionChanged = True
Логическое значение имеет значение 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 календарей выполняется при обратной передаче любого элемента управления, поэтому если выбрана одна дата, когда пользователь вызывает обратную передачу из другого элемента управления, календарь потеряет свой выбор.В моем случае это не проблема, но я искал способ обойти это ради совершенства.
Возможно, это не лучшее решение, но оно работает для меня!:)