DropDownList, содержащий недели
Я работаю над сайтом в интрасети, в частности над инструментом еженедельного мониторинга для сотрудников. Что мне нужно, это заполнить DropDownList
с неделями, например неделя:
Week : From 12/10/15 to 18/10/15
Я могу фильтровать на другой странице, но с годами и месяцами:
CalendarController c = new CalendarController();
ViewBag.ListYears = c.ListYears(iyear);
ViewBag.ListMonths = c.ListMonths(imonth);
ViewBag.ListDaysOfMonth = _service.ListDaysOfMonth(iyear.ToString(), imonth.ToString());
И используйте формы, чтобы сохранить их.
Как мне заполнить свой DDList списком, скажем, всех недель 2015 года?
2 ответа
Чтобы вернуть список отформатированных недель, вы можете использовать следующий метод
public List<string> FetchWeeks(int year)
{
List<string> weeks = new List<string>();
DateTime startDate = new DateTime(year, 1, 1);
startDate = startDate.AddDays(1 - (int)startDate.DayOfWeek);
DateTime endDate = startDate.AddDays(6);
while (startDate.Year < 1 + year)
{
weeks.Add(string.Format("Week: From {0:dd/MM/yyyy}to {1:dd/MM/yyyy}", startDate, endDate));
startDate= startDate.AddDays(7);
endDate = endDate.AddDays(7);
}
return weeks;
}
а потом в контроллере
var weeks = FetchWeeks(2105);
ViewBag.Weeks = new SelectList(weeks);
Однако при этом будет отформатировано отформатированное значение, которое может не пригодиться в контроллере, поэтому его можно изменить, чтобы создать IEnumerable<SelectListItem>
где Value
свойство представляет собой число, представляющее индекс недели в году и Text
Свойство - это форматированный текст.
Вот как вы получаете неделю текущего года ( слава здесь):
var jan1 = new DateTime(DateTime.Today.Year , 1, 1);
//beware different cultures, see other answers
var startOfFirstWeek = jan1.AddDays(1 - (int)(jan1.DayOfWeek));
var weeks=
Enumerable
.Range(0,54)
.Select(i => new {
weekStart = startOfFirstWeek.AddDays(i * 7)
})
.TakeWhile(x => x.weekStart.Year <= jan1.Year)
.Select(x => new {
x.weekStart,
weekFinish=x.weekStart.AddDays(4)
})
.SkipWhile(x => x.weekFinish < jan1.AddDays(1) )
.Select((x,i) => new {
x.weekStart,
x.weekFinish,
weekNum=i+1
});
Затем вы добавляете недели в dropdownList