Páginas

martes, 12 de octubre de 2010

Ordenamiento de Items en ListView al dar click en columnas [C#]

A veces necesitamos ordenar datos en un listview dependiendo la columna donde le demos clic, esto es fácil aplicando los algoritmos de ordenamiento conocidos, en el siguiente código cree una clase heredada de listview y le di luego esa característica, me evitará tener que escribir el código en cada una de los forms donde los use.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace SPControls
{
    public partial class JPListView : ListView
    {
        public JPListView()
        {
            InitializeComponent();
            this.ColumnClick += new ColumnClickEventHandler(JPListView_ColumnClick);
        }
        /// <summary>
        /// Metodo de Ordenamiento Automatico al hacer clic en las cabeceras de las columnas
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void JPListView_ColumnClick(object sender, ColumnClickEventArgs e)
        {
            if (ColumnIndexOrder != e.Column)
                OrderAsc(e.Column);
            else
            {
                if (OrderTypeSel == SPControls.JPListView.OrderType.Asc)
                    OrderDes(e.Column);
                else
                    OrderAsc(e.Column);
            }
        }
        public enum OrderType
        {
            Asc=1,
            Des=2
        }
        private int mColumnIndexOrder = 0;
        private OrderType mOrderTypeSel;
        public int ColumnIndexOrder
        {
            get { return mColumnIndexOrder; }
        }
        public OrderType OrderTypeSel
        {
            get { return mOrderTypeSel; }
        }
        /// <summary>
        /// Ordena la lista dependiendo del Índice Seleccionado
        /// Autor: Jackson Patricio Rosado Cedeño
         /// </summary>
        /// <param name="ColumnIndex"></param>
        public void OrderAsc(int ColumnIndex)
        {
            //Metodo de Inserción Directa
            ListViewItem Intercambio;
            int i, j;
            for (i = 1; i < Items.Count; i++)
            {
                Intercambio=Items[i];
                j = i - 1;
                while (string.Compare(Intercambio.SubItems[ColumnIndex].Text,Items[j].SubItems[ColumnIndex].Text)<0 && j >= 0)
                {
                    Items[j + 1] =(ListViewItem) Items[j].Clone();
                    j--;
                    if (j < 0)
                        break;
                }
                Items[j + 1] = Intercambio;
                mColumnIndexOrder = ColumnIndex;
                mOrderTypeSel = OrderType.Asc;
            }    
        }
        /// <summary>
        /// Ordena de Forma descendente dependiendo el indice seleccionado
        /// Autor: Jackson Patricio Rosado Cedeño
        /// </summary>
        /// <param name="ColumnIndex"></param>
        public void OrderDes(int ColumnIndex)
        {
            //Metodo de Inserción Directa
            ListViewItem Intercambio;
            int i, j;
            for (i = 1; i < Items.Count; i++)
            {
                Intercambio = Items[i];
                j = i - 1;
                while (string.Compare(Intercambio.SubItems[ColumnIndex].Text, Items[j].SubItems[ColumnIndex].Text) > 0 && j >= 0)
                {
                    Items[j + 1] = (ListViewItem)Items[j].Clone();
                    j--;
                    if (j < 0)
                        break;
                }
                Items[j + 1] = Intercambio;
            }
            mColumnIndexOrder = ColumnIndex;
            mOrderTypeSel = OrderType.Des;
        }
    }
}

No hay comentarios: