private void RenderSiteMap(SortableBindingList <Sprint> allSprints, SortableBindingList <Todo> allTodos, SortableBindingList <Project> allProjects) { foreach (Sprint sprint in allSprints.Reverse()) { DateTimeFormatInfo dfi = DateTimeFormatInfo.CurrentInfo; System.Globalization.Calendar cal = dfi.Calendar; int tasksCount = 0; if (sprint.Kanban != null) { tasksCount = sprint.Kanban.Count; } string period = string.Format("<span class='sprintName'>{0} <span class='period'>{1}-{2}</span> <span class='kw'> K.W.:{3}-{4}</span> <span class='wd'>(Left:{5} from {6} W.D.)</span> <span class='tasks'>{7} Tasks</span>", sprint.ShortDescription, sprint.StartDate.ToString("dd.MM ddd"), sprint.EndDate.ToString("dd.MM ddd"), cal.GetWeekOfYear(sprint.StartDate, CalendarWeekRule.FirstDay, DayOfWeek.Monday), cal.GetWeekOfYear(sprint.EndDate, CalendarWeekRule.FirstDay, DayOfWeek.Monday), DateTimeHelper.GetBusinessDays(DateTime.Now, sprint.EndDate), DateTimeHelper.GetBusinessDays(sprint.StartDate, sprint.EndDate), tasksCount); string sprintName = period; string sprintContent = "";//task.PublicText.Replace("\r\n", "<br />"); StringBuilder sprintSubContentBuilder = new StringBuilder(); List <Project> projectList = new List <Project>(); Dictionary <Project, List <Status> > projectStatusList = new Dictionary <Project, List <Status> >(); foreach (KanbanPosition kanbanPosition in sprint.Kanban) { Todo task = allTodos.Where(t => t.pId == kanbanPosition.TaskPid).Single(); Project project = allProjects.Where(p => p.pId == task.ProjectPid).Single(); if (!projectList.Contains(project)) { projectList.Add(project); projectStatusList.Add(project, new List <Status>()); projectStatusList[project].Add(kanbanPosition.Status); } } string currentUrl = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) + ResolveUrl("~/"); sprintSubContentBuilder.AppendLine("<ul>"); foreach (Project project in projectList) { string subContent = ""; string level2Template = ""; string link = $"{currentUrl}status/{sprint.Id}/{project.Id}"; level2Template = $"<li><a href=\"{link}\">{project.ShortDescription}</a></li>"; sprintSubContentBuilder.AppendLine(level2Template); } sprintSubContentBuilder.AppendLine("</ul>"); string sprintSubContent = sprintSubContentBuilder.ToString(); string level1Template = $"<li><h3 class=\"cbp-nttrigger\">{sprintName}</h3><div class=\"cbp-ntcontent\">{sprintSubContent}</div></li>"; TaskListPlanned.InnerHtml += level1Template; } }