Для всех, кто использует простые программы Client Server и получает эту ошибку, это проблема незакрытых (или закрытых для ранних) потоков ввода или вывода.
Попробуйте, это работает, чтобы выбрать несколько дат по месяцам. Убедитесь, что оба события связаны между собой.
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();
}
}
Похоже, что обратная передача плохо обрабатывается в вашем календаре, потому что, когда вы выбираете любую дату в календаре, вызывается Calendar1_DayRender и задаете список дат на ноль, таким образом, сеанс будет заполнен нулем, поэтому в Calendar1_SelectionChanged результат сеанса вернет NULL . Вы можете проверить, добавив точку останова в функцию Calendar1_DayRender и отслеживая ее действия.
Я нашел лучший способ справиться с этой проблемой - использовать 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);
}
Я пробовал что-то подобное, это может быть полезно:
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>";
}