예제 #1
0
        /// <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;
        }
예제 #2
0
        /// <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);
        }