ASPX日历保留会话[“ SelectedDates”]

时间:2019-03-19 08:36:14

标签: c# asp.net

我有一个日历,可以在ASP中选择多个日期。问题在于,更改为其他月份后,Session [“ SelectedDates”]将为空(大概是因为以前的日期不在视图中)。这样可以避免我选择多个月份中的多个日期,因为其他月份中的日期将被清除。我该如何解决这个问题?

我一直试图在OnVisibleMonthChanged期间将日期存储在temp var中,但是我无法使代码正常工作。

private List<DateTime> datelist = new List<DateTime>();

protected void Calendar1_SelectionChanged(object sender, EventArgs e)
{
    if (Session["SelectedDates"] != null)
    {
        List<DateTime> newList = (List<DateTime>)Session["SelectedDates"];

        foreach (DateTime dt in newList)
        {
            if (Calendar1.SelectedDates.Contains(dt))
            {
                Calendar1.SelectedDates.Remove(dt);
            }
            else
            {
                Calendar1.SelectedDates.Add(dt);
            }
        }
        datelist.Clear();
    }
}

protected void Calendar1_DayRender(object sender, DayRenderEventArgs e)
{
    if (e.Day.IsSelected == true)
    {
        datelist.Add(e.Day.Date);
    }
    Session["SelectedDates"] = datelist;
}

ASPX

                                    <asp:Calendar NextPrevStyle-ForeColor="White" ClientIDMode="Static" ID="Calendar1" OnDayRender="Calendar1_DayRender" OnSelectionChanged="Calendar1_SelectionChanged" OnVisibleMonthChanged="Calendar1_VisibleMonthChanged"
                                        runat="server" BorderWidth="1px"
                                        DayNameFormat="Shortest">
                                    </asp:Calendar>

4 个答案:

答案 0 :(得分:0)

在您的日历中,似乎回传处理得不好,因为当您在日历中选择任何日期时,会调用 Calendar1_DayRender 并将 datelist 设置为null,因此会话将填充为null,因此在 Calendar1_SelectionChanged 中,会话的结果将返回 NULL 。您可以通过在 Calendar1_DayRender 函数上添加断点并监视其动作来进行检查。

答案 1 :(得分:0)

尝试一下,它正在努力选择跨月的多个日期。确保两个事件都已链接。

public static List<DateTime> dateList = new List<DateTime>();

    protected void Calendar1_DayRender(object sender, DayRenderEventArgs e)
    {
        if (e.Day.IsSelected == true)
        {
            dateList.Add(e.Day.Date);
        }
        Session["SelectedDates"] = dateList;
    }


    protected void Calendar1_SelectionChanged(object sender, EventArgs e)
    {
        if (Session["SelectedDates"] != null)
        {
            List<DateTime> newList = (List<DateTime>)Session["SelectedDates"];
            foreach (DateTime dt in newList)
            {
                Calendar1.SelectedDates.Add(dt);
            }
            dateList.Clear();
        }
    }

答案 2 :(得分:0)

我尝试过类似的操作,这可能会有用:

protected void C1_SelectionChanged(object sender, EventArgs e)
    {
        Label1.Text = "";
        L1.Items.Add(C1.SelectedDate.ToShortDateString());

        ListItem[] x = new ListItem[L1.Items.Count];
        L1.Items.CopyTo(x, 0);
        Session["x"] = x;
        ListItem[] collection = (ListItem[])Session["x"];
        foreach (var item in collection)
        {

            Label1.Text += item.Text + "</br>";
        }
    }

您可以尝试以下方法:

List<DateTime> lb = new List<DateTime>();
        lb.Add(C1.SelectedDate);
        DateTime[] a = lb.ToArray();
        lb.CopyTo(a, 0);
        Session["x"] = a;
        DateTime[] collection = (DateTime[])Session["x"];
        foreach (var item in collection)
        {
            Label1.Text += item.ToShortDateString() + "</br>";
        }

答案 3 :(得分:0)

我发现处理此问题的更好方法是使用ViewState。我修改了https://sdevireddy.wordpress.com/2009/08/14/multiple-date-selection-in-asp-calendar/中的代码。每当更改选择时,我都会将ViewState传输到Session。然后可以从会话中获取日期。

public List<DateTime> SelectedDates
{
    get
    {
        if (ViewState["Dates"] != null)
            return (List<DateTime>)ViewState["Dates"];
        else
            return new List<DateTime>() { Calendar1.SelectedDate };
    }
    set
    {
        ViewState["Dates"] = value;
    }
}

protected void Calendar1_SelectionChanged(object sender, EventArgs e)
{
    foreach (DateTime selectedDate in Calendar1.SelectedDates)
    {
        if (SelectedDates.Contains(selectedDate))
            SelectedDates.Remove(selectedDate);
        else
            SelectedDates.Add(selectedDate);
    }

    ViewState["Dates"] = SelectedDates;
    Session["SelectedDates"] = ViewState["Dates"];
}

protected void Calendar1_PreRender(object sender, EventArgs e)
{
    Calendar1.SelectedDates.Clear();
    foreach (DateTime dt in SelectedDates)
        Calendar1.SelectedDates.Add(dt);
}