我正在尝试在C#Web日历控件上选择和取消选择日期。
我遇到的问题是我可以选择或取消选择日期,除非只选择了一个日期。
点击它不会触发选择更改事件,所以我需要在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;
}
}
}
}
答案 0 :(得分:1)
我今天正在寻找这个问题的快速答案,但找不到它,所以我开始寻找自己的解决方案。即使差不多一年之后我也会在这里张贴。 (我希望这不符合规则吗?)
注意:我的代码是在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在任何控件的回发上执行,因此如果在用户导致来自另一个控件的回发时选择了单个日期,则会导致日历丢失其选择。在我的情况下,这不是一个问题,但我一直在寻找一种方法来完善它。
这可能不是最好的解决方案,但它对我有用! :)