繁体   English   中英

在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM