![](/img/trans.png)
[英]How to programmatically select and deselect multiple dates in calendar control in asp.net?
[英]Deselect dates in ASP.NET Calendar Control
我正在尝试选择和取消选择C#Web日历控件上的日期。
我的问题是我可以选择或取消选择日期,除非只有一个选择的日期。
单击它不会触发选择更改事件,因此Ineed可以在dayrender事件中执行某些操作,但是我不确定是什么或如何执行。
编辑:添加了Pre_Render事件代码。 这现在似乎可以正常工作,但是似乎有点不稳定,例如,选择日期A:确定选择日期B:确定同时取消选择它们:确定选择日期A:不起作用,需要选择两次以取消选择日期A:确定选择日期C:选择日期A和c
@约翰
是的,我知道控件是.NET 2.0框架的一部分,与C#本身无关。
到目前为止的代码:
public static List<DateTime> list = new List<DateTime>();
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<DateTime> newList = (List<DateTime>)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<DateTime> 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#中
我对这个问题的解决方案是向我的页面类添加一个布尔变量,如下所示:
昏暗blnCalendarSelectionChanged为Boolean = False
有了这个,我可以通过将以下内容添加到calendar_SelectionChanged方法的开头来跟踪选择是否已更改:
blnCalendarSelectionChanged = True
仅在触发日历SelectionChanged事件后,布尔值才为true。 如果只剩下一个要取消选择的日期,则不会触发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是在任何控件的回发上执行的,因此,当用户从另一个控件进行回发时,如果选择单个日期,则日历将丢失其选择。 就我而言,这不是问题,但为了完美起见,我一直在寻找解决方法。
这可能不是最佳解决方案,但对我有用! :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.