Artigo: 319401 - Última revisão: quinta-feira, 13 de Março de 2008 - Revisão: 3.1

Como ordenar um controlo ListView numa coluna no Visual C#

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.

Nesta página

Expandir tudo | Reduzir tudo

Sumário

Este artigo passo a passo descreve como ordenar um controlo ListView numa coluna na aplicação do Visual C#.

Quando se trabalha com o controlo ListView , convém ordenar o respectivo conteúdo com base numa coluna específica. Um exemplo deste tipo de funcionalidade ocorre num programa Explorador do Windows quando visualiza o conteúdo de uma pasta no disco rígido. Na vista Detalhes, o Explorador do Windows apresenta informações sobre os ficheiros dessa pasta. Por exemplo, verá o nome do ficheiro, o tamanho do ficheiro, o tipo de ficheiro e a data em que o ficheiro foi modificado. Quando clica dos cabeçalhos da coluna, a lista é ordenada por ordem baseado essa coluna ascendente. Quando clicar novamente no mesmo cabeçalho de coluna, a coluna é ordenada por ordem descendente.

O exemplo neste artigo define uma classe que herda a interface IComparer . Além disso, este exemplo utiliza o método Comparar da classe CaseInsenstiveComparer para efectuar a comparação real dos itens. Note que este método de comparação não é sensível a maiúsculas / minúsculas ("Apple" é considerado igual a "maçãs"). Além disso, note que todas as colunas neste exemplo são ordenadas de uma forma de "texto". Se pretender ordenar de forma diferente (como, por exemplo, numericamente), pode substituir a seguinte linha de código com independentemente abordagem à ordenação que pretende utilizar:
ObjectCompare.Compare(listviewX.SubItems[ColumnToSort].Text,listviewY.SubItems[ColumnToSort].Text);
				

Como criar o projecto de exemplo

  1. Crie um novo projecto de aplicação do Visual C# Windows. É criado o Form1 por predefinição.
  2. Adicione um controlo ListView ao Form1. Dimensione o formulário para ser várias cm de largura por várias cm de altura.
  3. Cole o código seguinte para a classe para o formulário:
    private ListViewColumnSorter lvwColumnSorter;
    					
  4. Cole o código seguinte no construtor do formulário, depois da chamada ao método InitializeComponent :
    // Create an instance of a ListView column sorter and assign it 
    // to the ListView control.
    lvwColumnSorter = new ListViewColumnSorter();
    this.listView1.ListViewItemSorter = lvwColumnSorter;
    					
  5. Cole o seguinte código para o evento carregar do formulário:
    ColumnHeader columnheader;		// Used for creating column headers.
    ListViewItem listviewitem;		// Used for creating listview items.
    
    // Ensure that the view is set to show details.
    listView1.View = View.Details;
    
    // Create some listview items consisting of first and last names.
    listviewitem = new ListViewItem("John");
    listviewitem.SubItems.Add("Smith");
    this.listView1.Items.Add(listviewitem);
    
    listviewitem = new ListViewItem("Bob");
    listviewitem.SubItems.Add("Taylor");
    this.listView1.Items.Add(listviewitem);
    
    listviewitem = new ListViewItem("Kim");
    listviewitem.SubItems.Add("Zimmerman");
    this.listView1.Items.Add(listviewitem);
    
    listviewitem = new ListViewItem("Olivia");
    listviewitem.SubItems.Add("Johnson");
    this.listView1.Items.Add(listviewitem);
    			            
    // Create some column headers for the data. 
    columnheader = new ColumnHeader();
    columnheader.Text = "First Name";
    this.listView1.Columns.Add(columnheader);
    
    columnheader = new ColumnHeader();
    columnheader.Text = "Last Name";
    this.listView1.Columns.Add(columnheader);
    
    // Loop through and size each column header to fit the column header text.
    foreach (ColumnHeader ch in this.listView1.Columns)
    {			
    	ch.Width = -2;
    }
    					
    NOTA: O código deve ser alterado no Visual Studio 2005. Quando cria um projecto de Windows Forms, Visual C# adiciona um formulário ao projecto por predefinição. Este formulário é denominado Form1. Os dois ficheiros que representam o formulário são denominados Form1.cs e Form1.Designer.cs. Tem de escrever o código no Form1.cs. O ficheiro Designer.cs é onde o Windows Forms Designer escreve o código que implementa todas as acções efectuadas, adicionando controlos. Para obter mais informações sobre o Windows Forms Designer no Visual C# 2005, visite o seguinte Web site da Microsoft:
    http://msdn2.microsoft.com/en-us/library/ms173077.aspx (http://msdn2.microsoft.com/en-us/library/ms173077.aspx)
  6. Cole o código seguinte para o evento ColumnClick controlo ListView :
    // Determine if clicked column is already the column that is being sorted.
    if ( e.Column == lvwColumnSorter.SortColumn )
    {
    	// Reverse the current sort direction for this column.
    	if (lvwColumnSorter.Order == SortOrder.Ascending)
    	{
    		lvwColumnSorter.Order = SortOrder.Descending;
    	}
    	else
    	{
    		lvwColumnSorter.Order = SortOrder.Ascending;
    	}
    }
    else
    {
    	// Set the column number that is to be sorted; default to ascending.
    	lvwColumnSorter.SortColumn = e.Column;
    	lvwColumnSorter.Order = SortOrder.Ascending;
    }
    
    // Perform the sort with these new sort options.
    this.listView1.Sort();
    					
  7. No menu projecto , clique em Adicionar classe a adicionar uma nova classe ao projecto.
  8. Substituir todo o código predefinido da classe de novo o seguinte código:
    using System.Collections;	
    using System.Windows.Forms;
    
    /// <summary>
    /// This class is an implementation of the 'IComparer' interface.
    /// </summary>
    public class ListViewColumnSorter : IComparer
    {
    	/// <summary>
    	/// Specifies the column to be sorted
    	/// </summary>
    	private int ColumnToSort;
    	/// <summary>
    	/// Specifies the order in which to sort (i.e. 'Ascending').
    	/// </summary>
    	private SortOrder OrderOfSort;
    	/// <summary>
    	/// Case insensitive comparer object
    	/// </summary>
    	private CaseInsensitiveComparer ObjectCompare;
    
    	/// <summary>
    	/// Class constructor.  Initializes various elements
    	/// </summary>
    	public ListViewColumnSorter()
    	{
    		// Initialize the column to '0'
    		ColumnToSort = 0;
    
    		// Initialize the sort order to 'none'
    		OrderOfSort = SortOrder.None;
    
    		// Initialize the CaseInsensitiveComparer object
    		ObjectCompare = new CaseInsensitiveComparer();
    	}
    
    	/// <summary>
    	/// This method is inherited from the IComparer interface.  It compares the two objects passed using a case insensitive comparison.
    	/// </summary>
    	/// <param name="x">First object to be compared</param>
    	/// <param name="y">Second object to be compared</param>
    	/// <returns>The result of the comparison. "0" if equal, negative if 'x' is less than 'y' and positive if 'x' is greater than 'y'</returns>
    	public int Compare(object x, object y)
    	{
    		int compareResult;
    		ListViewItem listviewX, listviewY;
    
    		// Cast the objects to be compared to ListViewItem objects
    		listviewX = (ListViewItem)x;
    		listviewY = (ListViewItem)y;
    
    		// Compare the two items
    		compareResult = ObjectCompare.Compare(listviewX.SubItems[ColumnToSort].Text,listviewY.SubItems[ColumnToSort].Text);
    			
    		// Calculate correct return value based on object comparison
    		if (OrderOfSort == SortOrder.Ascending)
    		{
    			// Ascending sort is selected, return normal result of compare operation
    			return compareResult;
    		}
    		else if (OrderOfSort == SortOrder.Descending)
    		{
    			// Descending sort is selected, return negative result of compare operation
    			return (-compareResult);
    		}
    		else
    		{
    			// Return '0' to indicate they are equal
    			return 0;
    		}
    	}
        
    	/// <summary>
    	/// Gets or sets the number of the column to which to apply the sorting operation (Defaults to '0').
    	/// </summary>
    	public int SortColumn
    	{
    		set
    		{
    			ColumnToSort = value;
    		}
    		get
    		{
    			return ColumnToSort;
    		}
    	}
    
    	/// <summary>
    	/// Gets or sets the order of sorting to apply (for example, 'Ascending' or 'Descending').
    	/// </summary>
    	public SortOrder Order
    	{
    		set
    		{
    			OrderOfSort = value;
    		}
    		get
    		{
    			return OrderOfSort;
    		}
    	}
        
    }
    					
  9. Guarde, criar e, em seguida, execute o projecto de exemplo.
  10. Faça clique sobre os vários cabeçalhos de coluna no controlo ListView . Quando clica o cabeçalho, o conteúdo do controlo ListView é ordenado em ordem ascendente com base na coluna que clica. Quando clicar novamente no mesmo cabeçalho de coluna, a coluna é ordenada por ordem descendente.

A informação contida neste artigo aplica-se a:
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual C# 2005 Express Edition
  • Microsoft Visual C# 2008 Express Edition
Palavras-chave: 
kbmt kbctrl kbhowtomaster kblistview KB319401 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 319401  (http://support.microsoft.com/kb/319401/en-us/ )