Календарь ASPX сохраняет сеанс [«Выбранные даты»]

#c# #asp.net

#c# #asp.net

Вопрос:

У меня есть календарь, который может выбирать несколько дат в ASP. Проблема в том, что при переходе на другой месяц сеанс [«Выбранные даты»] будет пустым (предположительно, потому что предыдущие даты не отображаются). Это не позволяет мне выбирать несколько дат из нескольких месяцев, поскольку даты из других месяцев будут очищены. Как я могу исправить эту проблему?

Я пытался сохранить даты во временной переменной во время onVisibleMonthChanged, но я не могу заставить код работать правильно.

 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>
  

Ответ №1:

Похоже, что обратная передача плохо обрабатывается в вашем календаре, потому что, когда вы выбираете любую дату в своем календаре, вызывается Calendar1_DayRender и устанавливает для списка дат значение null, таким образом, сеанс будет заполнен null, поэтому в Calendar1_SelectionChanged результат сеанса вернет NULL. Вы можете проверить, добавив точку останова в функцию Calendar1_DayRender и отслеживая ее действия.

Ответ №2:

Попробуйте, это работает для выбора нескольких дат в течение месяцев. Убедитесь, что оба события связаны.

 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();
        }
    }
  

Комментарии:

1. Здесь та же проблема. Если вы нажмете дату, скажем, в январе, щелкните другую дату в марте, выбранная дата в январе исчезнет.

2. Можете ли вы опубликовать свой aspx-код для календаря? Есть ли у вас где-нибудь другой код, который мог бы помешать обратной передаче?

3. Когда я запускаю весь код в вашем сообщении, я получаю ту же проблему, что и у вас, когда я запускаю опубликованный мной код, он сохраняет даты по месяцам. Я не могу сразу определить, в чем проблема в вашем коде, но я внимательно просмотрю. Вы пробовали изменить весь код на тот, который я опубликовал?

4. Единственное отличие, которое я заметил, заключалось в том, что ваш список дат является общедоступным и статичным. Возможно, в этом проблема.

5. Я только что провел тест, вам просто нужен статический параметр в вашем списке дат, и он сохранит даты между месяцами

Ответ №3:

Я пробовал что-то подобное, это может быть полезно:

 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>";
        }
  

Ответ №4:

Я обнаружил, что лучшим способом решения этой проблемы было использование ViewState. Я изменил код из https://sdevireddy.wordpress.com/2009/08/14/multiple-date-selection-in-asp-calendar . Я переношу ViewState в сеанс всякий раз, когда изменяется выбор. Затем даты могут быть получены из сеанса.

 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);
}