ID do artigo: 816188 - Última revisão: sexta-feira, 30 de dezembro de 2005 - Revisão: 2.0

Como usar um controle ComboBox para editar dados em um controle ListView no Visual C++ .NET ou no Visual C++ 2005

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 | Recolher tudo

Sumário

Este artigo passo a passo descreve como usar um controle ComboBox para editar os dados em um controle ListView . Este método substituirá a abordagem de caixa de texto padrão de edição dos dados em um controle ListView .

Aprenda sobre a técnica

Usando a propriedade LabelEdit do controle ListView , você pode permitir que o usuário editar o conteúdo do controle ListView . Para editar os dados no controle ListView , você pode usar uma caixa de texto padrão. Ocasionalmente, convém outro controle para editar o controle. Este artigo descreve como usar um controle ComboBox para editar os dados em um controle ListView quando o controle ListView está no modo de exibição Detalhes.

Quando o usuário seleciona uma linha no controle ListView , um cálculo é executado para localizar o retângulo delimitador para a primeira coluna da linha que o usuário clicou. Que o cálculo considera que a coluna pode não estar visível ou pode não ficar totalmente visível quando o usuário clique na linha e quando o controle ComboBox é dimensionado e é exibido corretamente.

Além de posicionamento e dimensionamento do controle ComboBox , para este aplicativo de exemplo também aguarda das duas seguintes mensagens no controle ListView :
  • WM_VSCROLL
  • WM_HSCROLL.
Essas mensagens ocorrem sempre que o usuário rola o controle ListView verticalmente ou horizontalmente. Como o controle ComboBox não é parte do controle ListView fisicamente, o controle ComboBox não rola automaticamente com o controle ListView . Portanto, sempre que uma dessas duas mensagens ocorre, o controle ComboBox deve ficar ocultos. Para procurar essas mensagens, você deve criar uma classe UserControl personalizada que herda da classe ListView . Neste controle personalizado, o método WndProc é substituído para permitir todas as mensagens a ser verificado para rolagem.

Observação Para substituir o WndProc método, seu código e qualquer código que chama deve ter abandonado permissões de código ( SecurityPermission com o sinalizador UnmanagedCode especificado).

Criar o controle ListView herdado

  1. Inicie o Microsoft Visual Studio .NET 2003 ou Microsoft Visual Studio 2005.
  2. No menu arquivo , aponte para novo e, em seguida, clique em Project .
  3. Na caixa de diálogo New Project , clique em Projetos do Visual c++ em Tipos de projeto e, em seguida, clique em Windows Control Library (. NET) em modelos .

    Observação No Visual Studio 2005, clique em Visual C++ em Tipos de projeto e, em seguida, clique em Windows Forms Control Library em modelos .
  4. Na caixa nome , digite MyListView . Na caixa local , digite C:\test e, em seguida, clique em OK .
  5. Substituir todo o código na classe UserControl com o seguinte código: # pragma
    #pragma once
    
    using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Windows::Forms;
    using namespace System::Data;
    using namespace System::Drawing;
    
    namespace MyListView
    {
    	/// <summary> 
    	/// Summary for MyListViewControl
    	/// </summary>
    	///
    	/// WARNING: If you change the name of this class, you must change the 
    	///          'Resource File Name' property for the managed resource compiler tool 
    	///          that is associated with all .resx files that this class depends on.  
     ///          Otherwise, the designers cannot interact properly with localized
    	///          resources that are associated with this form.
    public __gc class MyListViewControl : public System::Windows::Forms::ListView
    	{	
    	public:
    		MyListViewControl(void)	
    		{
    			InitializeComponent();
    		}
    		
    	protected:
    		void Dispose(Boolean disposing)	
    		{
    			if (disposing && components)
    			{
    				components->Dispose();
    			}
    			__super::Dispose(disposing);
    		}
    		
    	private:
    		/// <summary>
    		/// Required designer variable.
    		/// </summary>
    		System::ComponentModel::Container* components;
    
    		/// <summary>
    		/// Required method for Designer support - do not modify
    		/// the contents of this method with the code editor.
    		/// </summary>
    		void InitializeComponent(void)
    		{
    		
    		}
    
     	private:
    		static const int WM_HSCROLL = 0x114;
    		static const int WM_VSCROLL = 0x115;
    
    	protected:
    		void WndProc(Message *msg)
    		{
    			// Look for the WM_VSCROLL or the WM_HSCROLL messages.
    			if ((msg->Msg == WM_VSCROLL) || (msg->Msg == WM_HSCROLL))
    			{
    				// Move focus to the ListView control to cause the ComboBox control to lose focus.
    				this->Focus();  
    			}
                
    			// Pass the message to default handler.
    			__super::WndProc(msg);
    		} 
    	};
    }
    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 o todo código de exemplo. Para adicionar a opção de compilador de suporte de tempo de execução idioma comum no Visual C++ 2005, siga estas etapas:
    1. Clique em Project e clique em <ProjectName> propriedades .

      Observação <ProjectName> é um espaço reservado para 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 configuração no painel à direita, clique em Aplicar e em seguida, clique em OK .
    Para obter mais informações sobre o common language runtime oferece suporte à opção do compilador, visite o seguinte site da Microsoft:
    / clr (Common Language Runtime Compilation)
    http://msdn2.microsoft.com/en-us/library/k8d11d4s.aspx (http://msdn2.microsoft.com/en-us/library/k8d11d4s.aspx)
  6. Salve e criar o projeto.

Criar o aplicativo de exemplo

  1. Siga estas etapas para criar um novo Windows Forms Application no Microsoft Visual C++. NET:
    1. No menu arquivo , aponte para novo e, em seguida, clique em Project .
    2. Na caixa de diálogo New Project , clique em Projetos do Visual c++ em Tipos de projeto e, em seguida, clique em Windows Forms Application (. NET) em modelos .

      Observação No Visual Studio 2005, clique em Visual C++ em Tipos de projeto e, em seguida, clique em Windows Forms Application em modelos .
    3. Na caixa nome , digite Q816188 e, em seguida, clique em OK . Por padrão, um formulário que é denominado Form1 é criado.
  2. Siga estas etapas para adicionar o controle que você criou na seção "Create the inherited ListView control" deste artigo para seu aplicativo do Windows:
    1. No menu Ferramentas , clique em Toolbox adicionar ou remover itens .
    2. Na caixa de diálogo Personalizar caixa de ferramentas , clique na guia .NET Framework Components e, em seguida, clique em Procurar .
    3. Na caixa de diálogo Abrir , localize o controle que você criou na seção "Create the inherited ListView control" e em seguida, clique em Abrir . Essa etapa adiciona esse controle para a caixa de ferramentas para que você pode usar o controle da mesma forma para qualquer outro controle.
    4. Adicione um controle MyListView ao Form1 .
  3. Adicione um controle ComboBox para Form1 .
  4. Na janela Propriedades do controle ComboBox , defina o valor da propriedade Name como cbListViewCombo e em seguida defina a propriedade Visible como False .
  5. Adicione o seguinte código à classe do Form1 acima o construtor:
    private:
    	ListViewItem *lvItem;
  6. Adicione o seguinte código ao evento Load do Form1 :
    // Add some items to the combo box list.
    this->cbListViewCombo->Items->Add(S"NC");
    this->cbListViewCombo->Items->Add(S"WA");
    
    // Set the view of the ListView control to Details.
    this->myListViewControl1->View = View::Details;
    
    // Turn on full row select.
    this->myListViewControl1->FullRowSelect = true;
    			
    // Add data to the ListView control.
    ColumnHeader *columnheader;
    ListViewItem *listviewitem;
    
    // Create sample ListView data.
    listviewitem = new ListViewItem(S"NC");
    listviewitem->SubItems->Add(S"North Carolina");
    this->myListViewControl1->Items->Add(listviewitem);
    
    listviewitem = new ListViewItem(S"WA");
    listviewitem->SubItems->Add(S"Washington");
    this->myListViewControl1->Items->Add(listviewitem);
    			
    // Create column headers for the data.
    columnheader = new ColumnHeader();
    columnheader->Text = S"State Abbreviation";
    this->myListViewControl1->Columns->Add(columnheader);
    
    columnheader = new ColumnHeader();
    columnheader->Text = S"State";
    this->myListViewControl1->Columns->Add(columnheader);
    
    // Loop through and size each column header to fit the column header text.
    ColumnHeader *ch;
    IEnumerator *ie = this->myListViewControl1->Columns->GetEnumerator();
    while (ie->MoveNext())
    {
    	ch = __try_cast<ColumnHeader *> (ie->Current);
    	ch->Width = -2;
    }
  7. Adicione o seguinte código ao evento SelectedValueChanged do controle ComboBox :
    // Set the text of the ListView item to match the ComboBox control.
    lvItem->Text = this->cbListViewCombo->Text;
    
    // Hide the ComboBox control.
    this->cbListViewCombo->Visible = false;
  8. Adicione o seguinte código ao evento Sair do controle ComboBox :
    // Set text of the ListView item to match the ComboBox control.
    lvItem->Text = this->cbListViewCombo->Text;
    
    // Hide the ComboBox control.
    this->cbListViewCombo->Visible = false;
    
  9. Adicione o seguinte código para KeyPress evento do controle ComboBox :
    // Verify that the user presses the ESC key.
    switch (e->KeyChar)
    {
    case (char)(int)Keys::Escape:
    {
    	// Reset the original text value, and then hide the ComboBox control.
    	this->cbListViewCombo->Text = lvItem->Text;
    	this->cbListViewCombo->Visible = false;
    	break;
    }
    case (char)(int)Keys::Enter:
    {
    	// Hide the ComboBox control.
    	this->cbListViewCombo->Visible = false;
    	break;
    }
    }
  10. Adicione o seguinte código para MouseUp evento do controle myListViewContro11 :
    // Get the item on the row that the user clicks.
    lvItem = this->myListViewControl1->GetItemAt(e->get_X(), e->get_Y());
    			 
    // Make sure that an item the user clicks.
    if (lvItem != NULL)
    {
     // Get the bounds of the item that the user clicks.
     Rectangle ClickedItem = lvItem->Bounds;
                     
     // Verify that the column is completely scrolled off to the left.
     if ((ClickedItem.Left + this->myListViewControl1->Columns->get_Item(0)->Width) < 0)
     {
      // If the cell is out of view to the left, do nothing.
      return;
     }
    			 
    // Verify that the column is partially scrolled off to the left.
    else if (ClickedItem.Left < 0)
    {
     // Determine if the column extends beyond the right side of the ListView control.
     if ((ClickedItem.Left + this->myListViewControl1->Columns->get_Item(0)->Width) > this->myListViewControl1->Width)
     {
      // Set the width of the column to match the width of the ListView control.
      ClickedItem.Width = this->myListViewControl1->Width;
      ClickedItem.X = 0;
     }
     else
     {
      // The right side of the cell is in view.
      ClickedItem.Width = this->myListViewControl1->Columns->get_Item(0)->Width + ClickedItem.Left;
      ClickedItem.X = 2;
     }					
    }
    else if (this->myListViewControl1->Columns->get_Item(0)->Width > this->myListViewControl1->Width)
    {
     ClickedItem.Width = this->myListViewControl1->Width;
    }
    else
    {
     ClickedItem.Width = this->myListViewControl1->Columns->get_Item(0)->Width;
     ClickedItem.X = 2;
    }				
    	 
    // Adjust the top to account for the location of the ListView control.
    ClickedItem.Y += this->myListViewControl1->Top;
    ClickedItem.X += this->myListViewControl1->Left;	
    
    // Assign calculated bounds to the ComboBox control.
    this->cbListViewCombo->Bounds = ClickedItem;
                     
    // Set default text for the ComboBox control to match the item that the user clicks.
    this->cbListViewCombo->Text = lvItem->Text;
    
    // Display the ComboBox control, and then make sure that it is on top with focus.
    this->cbListViewCombo->Visible = true;
    this->cbListViewCombo->BringToFront();
    this->cbListViewCombo->Focus();
    }
    

Verificar se ele funciona

  1. Salve e em seguida, executar a amostra.
  2. Clique em uma linha no controle ListView .

    Observe que uma caixa de combinação aparece sobre o local da primeira coluna da linha atual.
  3. Para ocultar a caixa de combinação, clique em um item na caixa de combinação, pressione ESC e em seguida, percorra o controle ListView ou clique em outro controle.

    Observe que o valor que você clicou na caixa de combinação é colocado na primeira coluna da linha clicada do controle ListView .

A informação contida neste artigo aplica-se a:
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
Palavras-chave: 
kbmt kbwindowsforms kbcode kbprogramming kblistview kbcontrol kbcombobox kbhowtomaster KB816188 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 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: 816188  (http://support.microsoft.com/kb/816188/en-us/ )