Como classificar um controle ListView por uma coluna no Visual C++ .NET ou no Visual C++ 2005

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 traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 816183
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.

Para uma versão deste artigo do Microsoft Visual Basic. NET, consulte 319399.
Para obter uma Microsoft Visual translation from VPE for Csharp .NET versão deste artigo, consulte 319401.

Este artigo se refere ao seguinte namespace Microsoft .NET Framework Class Library:
  • System.Collections

NESTA TAREFA

Sumário
Este artigo passo a passo descreve como classificar um controle ListView por uma coluna em seu aplicativo Microsoft Visual C++ .NET ou Microsoft Visual C++ 2005.

Quando você estiver trabalhando com o controle ListView , talvez queira classificar seu conteúdo com base em dados de coluna específica. Um exemplo desse tipo de funcionalidade ocorre em um programa do Microsoft Windows Explorer quando você exibir o conteúdo de uma pasta em seu disco rígido. No modo de exibição detalhes, o Windows Explorer exibe informações sobre arquivos nessa pasta. Por exemplo, você verá o nome do arquivo, o tamanho do arquivo, o tipo de arquivo e a data em que o arquivo foi modificado. Quando você clica em um dos cabeçalhos de coluna, a lista é classificada em ordem com base em que dados de coluna crescente. Quando você clicar no cabeçalho da coluna mesmo novamente, a coluna está classificada em ordem decrescente.

O exemplo neste artigo define uma classe que herda da interface IComparer . Além disso, este exemplo usa o método Compare da classe CaseInsenstiveComparer para executar a comparação real dos itens. Observe que esse método de comparação não é diferencia maiúsculas de minúsculas ("Apple" é considerada a mesma "maçã"). Além disso, observe que as colunas do controle ListView neste exemplo são classificadas em uma forma de "text". Se você deseja classificar de maneira diferente (como numericamente), você pode substituir a linha de código a seguir com qualquer abordagem para a classificação que você deseja usar:
ObjectCompare->Compare(listviewX->SubItems->Item[ColumnToSort]->Text,listviewY->SubItems->Item[ColumnToSort]->Text);
back to the top

Requisitos

Este artigo pressupõe que você esteja familiarizado com os seguintes tópicos:
  • Intermediário Noções básicas sobre conceitos de programação do Visual C++

A lista a seguir descreve o hardware recomendado, software, infra-estrutura de rede e service packs que você precisa:
  • Microsoft Visual C++ .NET 2003 ou Microsoft Visual C++ 2005
back to the top

Criar o projeto de exemplo

Criar um novo projeto

  1. Inicie Microsoft Visual Studio .NET 2003 ou Microsoft Visual Studio 2005.
  2. No menu arquivo , aponte para novo e, em seguida, clique em Project . A caixa de diálogo New Project é exibida.
  3. Em Project Types , clique em Projetos do Visual c++ . Em modelos , clique em Windows Forms Application (NET) .

    Observação No Visual Studio 2005, clique em Visual C++ em Tipos de projeto e, em seguida, clique em Windows Forms Application em modelos .
  4. Na caixa nome , digite Q816183 .
  5. Na caixa Localizar , digite C:\ e, em seguida, clique em OK .

    Por padrão, é criado o Form1 .
back to the top

Adicionar e, em seguida, configurar um controle ListView

  1. Adicione um controle ListView para Form1 . Dimensione o formulário para ser vários polegadas de largura e vários cm de altura.
  2. Clique com o botão direito do mouse no Form1 e, em seguida, clique em View Code .
  3. Cole o seguinte código na classe Form1 :
    private: ListViewColumnSorter *lvwColumnSorter;
  4. Cole o seguinte código na função de construtor da classe Form1 , após a chamada para o método InitializeComponent :
    // Create an instance of a ListView column sorter and assign it // to the ListView control.lvwColumnSorter = new ListViewColumnSorter();listView1->ListViewItemSorter = lvwColumnSorter;
  5. Pressione SHIFT+F7 para alternar para o formulário Designer.
  6. Clique duas vezes em Form1 para criar o evento Form1_Load .
  7. Cole o seguinte código no evento Load do formulário:
    ColumnHeader *columnheader;		// This is used for creating column headers.ListViewItem *listviewitem;		// This is used to create ListView items.listView1->Enabled = true;// Make sure that the view is set to show details.listView1->set_View(System::Windows::Forms::View::Details);// Create some ListView items that include first and last names.listviewitem = new ListViewItem("John");listviewitem->SubItems->Add("Smith");this->listView1->Items->Add(listviewitem);listviewitem = new ListViewItem("Brian");listviewitem->SubItems->Add("Lloyd");this->listView1->Items->Add(listviewitem);listviewitem = new ListViewItem("Kimberly");listviewitem->SubItems->Add("Zimmerman");this->listView1->Items->Add(listviewitem);listviewitem = new ListViewItem("Tamara");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.IEnumerator* iEnum = this->listView1->Columns->GetEnumerator();while(iEnum->MoveNext())				{	ColumnHeader *ch;	ch = __try_cast<ColumnHeader*>(iEnum->Current);	ch->set_Width(-2);}
    Observação você deve adicionar o common language runtime oferecem suporte a compilador opção ( / CLR: oldSyntax ) no Visual C++ 2005 a compilar com êxito este exemplo de código. Para fazer isso, execute as seguintes etapas:
    1. Clique em projeto e, em seguida, clique em propriedades ProjectName .

      Observação ProjectName representa o nome do projeto.
    2. Expanda Configuration Properties e, em seguida, clique em Geral .
    3. Clique para selecionar Common Language Runtime suporte, sintaxe antiga (/ CLR: oldSyntax) no projeto oferece suporte a Common Language Runtime definindo no painel à direita, clique em Aplicar e em seguida, clique em OK .
    Para obter mais informações sobre o common language runtime oferece suporte às opções de compilador, visite o seguinte site:
    /CLR (common Language Runtime Compilation)
    http://msdn2.microsoft.com/en-us/library/k8d11d4s.aspx
  8. Pressione SHIFT+F7 para alternar para o formulário Designer.
  9. Clique com o botão direito do controle ListView e, em seguida, clique em Propriedades .
  10. Na janela Propriedades, clique em eventos e, em seguida, clique duas vezes o evento ColumnClick na lista de eventos.
  11. Cole o seguinte código no evento ColumnClick para o controle ListView :
    // Determine if the 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. By default, this is in ascending order.	lvwColumnSorter->SortColumn = e->Column;	lvwColumnSorter->Order = SortOrder::Ascending;}// Perform the sort with these new sort options.listView1->Sort();
back to the top

Adicionar e, em seguida, configurar a classe ListViewColumnSorter

  1. No menu Project , clique em Adicionar classe para adicionar uma nova classe para o projeto.
  2. Na caixa de diálogo Add Class , clique em Classe do C++ genérico em modelos e, em seguida, clique em Abrir .

    Observação No Visual Studio 2005, clique em Visual C++ em modelos e clique em Adicionar .
  3. No Assistente de classe C++ genérico, digite ListViewColumnSorter no nome da classe da caixa.
  4. Digite IComparer na caixa de classe base e em seguida, clique em Concluir .

    A classe ListViewColumnSorter aparece da seguinte maneira:
    #pragma onceclass ListViewColumnSorter :	public IComparer{public:	ListViewColumnSorter(void);	~ListViewColumnSorter(void);};
  5. Para tornar ListViewColumnSorter classe uma classe C++ gerenciado, adicione a palavra-chave __gc na frente da classe ListViewColumnSorter :
    __gc class ListViewColumnSorter :	public IComparer{public:	ListViewColumnSorter(void);	~ListViewColumnSorter(void);};
  6. Substitua o código no arquivo ListViewColumnSorter.h com o seguinte: # pragma
    #pragma onceusing namespace System;using namespace System::Collections;	using namespace System::Windows::Forms;__gc class ListViewColumnSorter: public IComparer{	// Specifies the column that is to be sorted.	private:		int ColumnToSort;				// Specifies the order in which to sort ('Ascending' or 'Descending').		SortOrder OrderOfSort;				// Case insensitive comparer object.		CaseInsensitiveComparer *ObjectCompare;	public:		ListViewColumnSorter(void);		~ListViewColumnSorter(void);		int Compare(Object *x, Object *y);		// Gets or sets the number of the column to which to apply the sorting   // operation (by default, this number is 0).	public: 		__property void set_SortColumn(int val)		{			ColumnToSort = (val);		}		__property int get_SortColumn()		{			return ColumnToSort;		}		// Gets or sets the order of sorting to apply (for example, 'Ascending' or 'Descending').		__property void set_Order(SortOrder val)		{			OrderOfSort = (val);		}			__property SortOrder get_Order()		{			return OrderOfSort;		}};
  7. Localize o construtor ListViewColumnSorter no arquivo ListViewColumnSorter.cpp e adicione o código a seguir:
    // Initialize the column to '0'.ColumnToSort = 0;// Initialize the sort order to 'none'.OrderOfSort = SortOrder::None;// Initialize the CaseInsensitiveComparer object.ObjectCompare = new CaseInsensitiveComparer();
  8. Implemente o código para o método Compare. Para fazer isso, cole o código a seguir no ListViewColumnSorter.cpp file:
    /// <summary>/// This method is inherited from the IComparer interface.  It compares the two objects/// that are passed by 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>ListViewColumnSorter::Compare(Object *x, Object *y){	int compareResult;	ListViewItem *listviewX, *listviewY;	// Cast the objects to be compared to ListViewItem objects.	listviewX = static_cast <ListViewItem *> (x);	listviewY = static_cast <ListViewItem *> (y);	// Compare the two items.	compareResult = ObjectCompare->Compare(listviewX->SubItems->Item[ColumnToSort]->Text,listviewY->SubItems->Item[ColumnToSort]->Text);			// Calculate correct return value based on object comparison.	if (OrderOfSort == SortOrder::Ascending)	{		// If ascending sort is selected, return the normal result of the compare operation.		return compareResult;	}	else if (OrderOfSort == SortOrder::Descending)	{		// If descending sort is selected, return the negative result of the compare operation.		return (-compareResult);	}	else	{		// Return '0' to indicate that they are equal.		return 0;	}}
  9. No arquivo Form1.h , adicione o código a seguir na parte superior:
    #include "listviewcolumnsorter.h"
back to the top

Salvar, criar e executar o projeto

  1. Pressione CTRL + SHIFT + S para salvar o projeto.
  2. Pressione CTRL + SHIFT + B para criar a solução.
  3. Pressione CTRL+F5 para executar o projeto de exemplo.
  4. Clique nos vários cabeçalhos de coluna no controle ListView . Quando você clicar em cabeçalho, o conteúdo do controle ListView é classificado em ordem crescente com base na coluna que você clique em. Quando você clicar no cabeçalho da coluna mesmo novamente, essa coluna é classificada em ordem decrescente.
back to the top
Referências
Para mais informações sobre classificação de controle ListView , visite o seguinte Microsoft Developer Network (MSDN) sites:back to the top

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 816183 - Última Revisão: 12/08/2015 02:12:56 - Revisão: 2.2

Microsoft Visual C++ .NET 2003 Standard Edition, Microsoft .NET Framework 1.1, Microsoft Visual C++ 2005 Express Edition

  • kbnosurvey kbarchive kbmt kbwindowsforms kbcode kblistview kbctrl kbhowtomaster KB816183 KbMtpt
Comentários