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

时间:2010-04-13 07:29:23

标签: c# asp.net calendar

我正在尝试在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;
                }
            }
        }
    }

1 个答案:

答案 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在任何控件的回发上执行,因此如果在用户导致来自另一个控件的回发时选择了单个日期,则会导致日历丢失其选择。在我的情况下,这不是一个问题,但我一直在寻找一种方法来完善它。

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