ASPX Calendar Keep Session [& ldquo; SelectedDates & rdquo;]

Для всех, кто использует простые программы Client Server и получает эту ошибку, это проблема незакрытых (или закрытых для ранних) потоков ввода или вывода.

1
задан gxexx 19 March 2019 в 09:18
поделиться

4 ответа

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

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();
        }
    }
0
ответ дан SCrosher 19 March 2019 в 09:18
поделиться

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

0
ответ дан AhmadMM 19 March 2019 в 09:18
поделиться

Я нашел лучший способ справиться с этой проблемой - использовать 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);
}
0
ответ дан gxexx 19 March 2019 в 09:18
поделиться

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

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>";
        }
0
ответ дан Tomasz Vizaint 19 March 2019 в 09:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: