/// <summary> /// Iterates over list of time entries for a project to populate the /// hierarchical list. private TimeSpan AddProjectToList(TreeNode parent, TimeTrackerDataSet.ProjectsRow project) { TimeSpan entryTime, dayCumulative = new TimeSpan(), projectCumulative = new TimeSpan(); TreeNode dayNode = null, entryNode; DateTime projectDay = DateTime.MinValue; foreach (TimeTrackerDataSet.TimeEntriesRow tRow in project.GetTimeEntriesRows()) { // Ignore open entries if (tRow.IsEndTimeNull()) { continue; } // Scope for date range (not the most efficient...) if (tRow.StartTime.Date < startDateTimePicker.Value.Date || tRow.EndTime.Date > endDateTimePicker.Value.Date) { continue; } // See if date has rolled over if (tRow.StartTime.Date > projectDay) { if (dayNode != null) { dayNode.Text += FormatTimeSpan(dayCumulative); dayCumulative = new TimeSpan(); } projectDay = tRow.StartTime.Date; dayNode = parent.Nodes.Add($"{projectDay:d} "); } entryTime = tRow.EndTime.Subtract(tRow.StartTime); // Add current time entry entryNode = dayNode.Nodes.Add($"{tRow.StartTime:t}-{tRow.EndTime:t} "); projectCumulative += entryTime; dayCumulative += entryTime; entryNode.Text += FormatTimeSpan(entryTime); } // Last day must be updated if (dayNode != null) { dayNode.Text += FormatTimeSpan(dayCumulative); } return(projectCumulative); }