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
- Crie um novo projecto de aplicação do Visual C# Windows. É criado o Form1 por predefinição.
- Adicione um controlo ListView ao Form1. Dimensione o formulário para ser várias cm de largura por várias cm de altura.
- Cole o código seguinte para a classe para o formulário:
private ListViewColumnSorter lvwColumnSorter;
- 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;
- 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: - 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();
- No menu projecto , clique em Adicionar classe a adicionar uma nova classe ao projecto.
- 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;
}
}
}
- Guarde, criar e, em seguida, execute o projecto de exemplo.
- 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.