/// <summary> /// Genera los grupos en el listView /// </summary> private void BuildGroups(int intGroupColumn) { // Limpia los grupos Groups.Clear(); // Obtiene el número de elementos para forzar que se realice cualquier cambio pendiente en la caché interna del ListView // Sin esto iterar sobre Items puede que no funcione correctamente si aún no se ha creado el handle del ListView int intDummy = Items.Count; // Separa los elementos de la lista en grupos utilizando la clave del grupo como descripción Dictionary <String, List <ListViewItem> > dctMap = new Dictionary <String, List <ListViewItem> >(); foreach (ListViewItem lsiItem in Items) { string strKey = lsiItem.SubItems[intGroupColumn].Text; if (intGroupColumn == 0 && strKey.Length > 0 && GroupByFirstCharacter) { strKey = strKey.Substring(0, 1); } if (!dctMap.ContainsKey(strKey)) { dctMap[strKey] = new List <ListViewItem>(); } dctMap[strKey].Add(lsiItem); } // Crea una lista con los grupos necesarios List <ListViewGroup> lstGroups = new List <ListViewGroup>(); foreach (string strKey in dctMap.Keys) { lstGroups.Add(new ListViewGroup(strKey)); } // Ordena los grupos lstGroups.Sort(new clsListViewGroupSorter(Sorting)); // Añade los grupos a la lista y dentro de cada grupo sus miembros // El orden es importante: // - la cabecera debe calculares antes de añadir el grupo a la lista, en otro caso, cambiar la cabecera // provoca un redibujo desagradable (incluso aunque esté dentro de un bloque BeginUpdate...EndUpdate) // - el grupo se debe añadir antes que sus elementos, en otro caso se lanza una excepción clsListViewSorter objSorter = GetListSorter(intGroupColumn, Sorting); foreach (ListViewGroup lsgGroup in lstGroups) { Groups.Add(lsgGroup); dctMap[lsgGroup.Header].Sort(objSorter); lsgGroup.Items.AddRange(dctMap[lsgGroup.Header].ToArray()); } // Muestra los grupos ShowGroups = true; }
/// <summary> /// Obtiene la clase que se utiliza para realizar la ordenación /// </summary> private clsListViewSorter GetListSorter(int intColumn, SortOrder intSortOrder) { clsListViewSorter objSorter = new clsListViewSorter(intColumn, ListViewColumnType.Text, Sorting); int intColumnType; // Obtiene la ordenación dependiendo del tipo de columna if (Columns[intColumn].Tag != null && int.TryParse(Columns[intColumn].Tag.ToString(), out intColumnType)) { switch (intColumnType) { case (int)ListViewColumnType.Date: objSorter = new clsListViewSorter(intColumn, ListViewColumnType.Date, Sorting); break; case (int)ListViewColumnType.Number: objSorter = new clsListViewSorter(intColumn, ListViewColumnType.Number, Sorting); break; } } // Devuelve el objeto de ordenación return(objSorter); }