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 :
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
- Inicie o Microsoft Visual Studio .NET 2003 ou Microsoft Visual Studio 2005.
- No menu arquivo , aponte para novo e, em seguida, clique em Project .
- 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 . - Na caixa nome , digite MyListView . Na caixa local , digite C:\test e, em seguida, clique em OK .
- 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: - Clique em Project e clique em <ProjectName> propriedades .
Observação <ProjectName> é um espaço reservado para o nome do projeto. - Expanda Configuration Properties e, em seguida, clique em Geral .
- 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: - Salve e criar o projeto.
Criar o aplicativo de exemplo
- Siga estas etapas para criar um novo Windows Forms Application no Microsoft Visual C++. NET:
- No menu arquivo , aponte para novo e, em seguida, clique em Project .
- 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 . - Na caixa nome , digite Q816188 e, em seguida, clique em OK . Por padrão, um formulário que é denominado Form1 é criado.
- 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:
- No menu Ferramentas , clique em Toolbox adicionar ou remover itens .
- Na caixa de diálogo Personalizar caixa de ferramentas , clique na guia .NET Framework Components e, em seguida, clique em Procurar .
- 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.
- Adicione um controle MyListView ao Form1 .
- Adicione um controle ComboBox para Form1 .
- Na janela Propriedades do controle ComboBox , defina o valor da propriedade Name como cbListViewCombo e em seguida defina a propriedade Visible como False .
- Adicione o seguinte código à classe do Form1 acima o construtor:
private:
ListViewItem *lvItem;
- 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;
} - 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;
- 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;
- 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;
}
} - 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
- Salve e em seguida, executar a amostra.
- Clique em uma linha no controle ListView .
Observe que uma caixa de combinação aparece sobre o local da primeira coluna da linha atual. - 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 .