public override IList <OLVGroup> GetGroups(GroupingParameters parms) { // This strategy can only be used on FastObjectListViews FastObjectListView folv = (FastObjectListView)parms.ListView; // Separate the list view items into groups, using the group key as the descrimanent int objectCount = 0; NullableDictionary <object, List <object> > map = new NullableDictionary <object, List <object> >(); foreach (object model in folv.Objects) { object key = parms.GroupByColumn.GetGroupKey(model); if (!map.ContainsKey(key)) { map[key] = new List <object>(); } map[key].Add(model); objectCount++; } // Sort the items within each group OLVColumn primarySortColumn = parms.SortItemsByPrimaryColumn ? parms.ListView.GetColumn(0) : parms.PrimarySort; ModelObjectComparer sorter = new ModelObjectComparer(primarySortColumn, parms.PrimarySortOrder, parms.SecondarySort, parms.SecondarySortOrder); foreach (object key in map.Keys) { map[key].Sort(sorter); } // Make a list of the required groups List <OLVGroup> groups = new List <OLVGroup>(); foreach (object key in map.Keys) { string title = parms.GroupByColumn.ConvertGroupKeyToTitle(key); if (!String.IsNullOrEmpty(parms.TitleFormat)) { int count = map[key].Count; title = String.Format((count == 1 ? parms.TitleSingularFormat : parms.TitleFormat), title, count); } OLVGroup lvg = new OLVGroup(title); lvg.Key = key; lvg.SortValue = key as IComparable; lvg.Contents = map[key].ConvertAll <int>(delegate(object x) { return(folv.IndexOf(x)); }); lvg.VirtualItemCount = map[key].Count; if (parms.GroupByColumn.GroupFormatter != null) { parms.GroupByColumn.GroupFormatter(lvg, parms); } groups.Add(lvg); } // Sort the groups groups.Sort(new OLVGroupComparer(parms.PrimarySortOrder)); // Build an array that remembers which group each item belongs to. this.indexToGroupMap = new List <int>(objectCount); this.indexToGroupMap.AddRange(new int[objectCount]); for (int i = 0; i < groups.Count; i++) { OLVGroup group = groups[i]; List <int> members = (List <int>)group.Contents; foreach (int j in members) { this.indexToGroupMap[j] = i; } } return(groups); }
public FastObjectListDataSource(FastObjectListView listView) : base(listView) { }