Páginas

quarta-feira, 16 de março de 2011

Ordenação no DataGridView

Não é tão simples fazer uma ordenação em um DataGridView no Windows Form programaticamente, quanto é no GridView do Web Form!

No Web Form é simples, basta atribuir a propriedade AllowSorting para true e implementar o evento Sorting do GridView.

Agora no Windows Form é um pouco diferente, pois no DataGridView não existe a propriedade e nem o evento dito anteriormente.

(Obs.: Se você criar um DataGridView e não populá-lo programaticamente (utilizando a propriedade DataSource), a ordenação funcionará automaticame sem a necessidade de utilizar o código abaixo.)

Então como fazer a ordenação!?
E se utilizarmos a interface IComparer?

Vamos ao código!

Temos uma entidade chamada Item, que contêm os atributos que serão exibidos no DataGridView.
public class Item
{
    public int Codigo { get; set; }
    public string Nome { get; set; }
}

Criamos uma classe para realizar a comparação dos itens, com o intuito de ordenar os itens, esta classe implementa a interface genérica IComparer e o código da comparação é adicionado no método Compare.
public class ItemComparer : IComparer
{
    private int _comparerColumnIndex = 0;

    public ItemComparer(int comparerColumnIndex)
    {
        _comparerColumnIndex = comparerColumnIndex;
    }

    #region IComparer Members
    public int Compare(Item x, Item y)
    {
        int retorno = 0;
        switch (_comparerColumnIndex)
        {
            case 0:
                retorno = x.Codigo.CompareTo(y.Codigo);
                break;
            case 1:
                retorno = string.Compare(x.Nome, y.Nome);
                break;
        }
        return retorno;
    }
    #endregion
}

Para efetuar a ordenação, criamos um form com um DataGridView.
Neste DataGridView utilizamos o evento ColumnHeaderMouseClick. Este evento será disparado quando o usuário clicar sobre o Header da coluna na Grid.

Na implementação deste evento, efetuamos a chamada ao método Carregar passando como parâmetro o índice da coluna que foi clicado, para popular a Grid.

Neste método, criamos a lista genérica de Item e utilizamos a classe criada anteriormente (ItemComparer), passando no construtor o índice que foi clicado e após isto utilizamos o método Sort da lista genérica antes de atribuir a lista ao DataSource do Grid.

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        this.Carregar(null);
    }

    private void Carregar(int? columnIndex)
    {
        List itens = new List() { new Item() { Codigo = 2, Nome = "ABC" }, new Item() { Codigo = 1, Nome = "XYZ" } };
        if (columnIndex != null)
        {
            ItemComparer comparer = new ItemComparer(columnIndex.Value);
            itens.Sort(comparer);
        }
        dataGridView1.DataSource = itens;
    }

    private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
    {
        this.Carregar(e.ColumnIndex);
    }
}

0 comentários:

Postar um comentário