Você está offline; aguardando reconexão

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

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: 320342
Para obter um Microsoft Visual translation from VPE for Csharp 2005 e Microsoft Visual translation from VPE for Csharp .NET versão deste artigo, consulte 320344.
Sumário
Este artigo passo a passo demonstra 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 .

Descrição da 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, é útil ter outro controle para editar o controle. Este artigo simula como usar um controle ComboBox para editar os dados em uma ListView quando ListView está no modo de exibição Detalhes.

Quando o usuário seleciona uma linha em ListView , um cálculo é executado para localizar o retângulo delimitador para a primeira coluna da linha que é clicada. Que o cálculo leva em consideração que a coluna pode não estar visível ou pode não ficar totalmente visível quando a linha for clicada e quando ComboBox é dimensionado e exibidos adequadamente.

Além de posicionamento e dimensionamento ComboBox , para esse exemplo também observa para controlam duas mensagens em ListView : WM_VSCROLL e WM_HSCROLL. Essas mensagens ocorrem sempre que o usuário rola o controle ListView verticalmente ou horizontalmente. Como o ComboBox fisicamente não é parte do controle ListView , ComboBox não rola automaticamente com a ListView . Portanto, sempre que ocorrer uma dessas duas mensagens, ComboBox deve estar ocultas. Para procurar essas mensagens, crie 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.

Criar o controle ListView herdado

  1. Inicie Microsoft Visual Studio .NET 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 Basic em Tipos de projeto e, em seguida, clique em Windows Control Library em modelos .

    Observação No Visual Studio 2005, clique em Visual Basic em vez de Projetos do Visual Basic .
  4. Substituir todo o código na classe UserControl com o seguinte código.
    Imports SystemImports System.CollectionsImports System.ComponentModelImports System.DrawingImports System.DataImports System.Windows.FormsPublic Class MyListView    Inherits System.Windows.Forms.ListView#Region " Windows Form Designer generated code "    Public Sub New()        MyBase.New()        'This call is required by the Windows Form Designer.        InitializeComponent()        'Add any initialization after the InitializeComponent() call    End Sub    'UserControl1 overrides dispose to clean up the component list.    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)        If disposing Then            If Not (components Is Nothing) Then                components.Dispose()            End If        End If        MyBase.Dispose(disposing)    End Sub    'Required by the Windows Form Designer    Private components As System.ComponentModel.IContainer    'NOTE: The following procedure is required by the Windows Form Designer    'It can be modified using the Windows Form Designer.      'Do not modify it using the code editor.    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()        components = New System.ComponentModel.Container()    End Sub#End Region    Private Const WM_HSCROLL As Integer = &H114    Private Const WM_VSCROLL As Integer = &H115    Protected Overrides Sub WndProc(ByRef msg As Message)        ' Look for the WM_VSCROLL or the WM_HSCROLL messages.        If ((msg.Msg = WM_VSCROLL) Or (msg.Msg = WM_HSCROLL)) Then            ' Move focus to the ListView to cause ComboBox to lose focus.            Me.Focus()        End If        ' Pass message to default handler.        MyBase.WndProc(msg)    End SubEnd Class					
  5. Salvar e, em seguida, crie o projeto.

Criar o aplicativo de exemplo

  1. Siga estas etapas para criar um aplicativo do Windows no Visual Basic 2005 ou no Visual Basic. 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 Basic em Project Types e clique em Windows Application em modelos . Por padrão, é criado o Form1.

      Observação No Visual Studio 2005, clique em Visual Basic em vez de Projetos do Visual Basic .

      Observação Você deve alterar o código no Visual Basic 2005. Por padrão, Visual Basic cria dois arquivos para o projeto quando você cria um projeto Windows Forms. Se o formulário é denominado Form1, os dois arquivos que representam o formulário são chamados de Form1.vb e Form1.Designer.vb. Escreva o código no arquivo Form1.vb. O Windows Forms Designer escreve o código no arquivo Form1.Designer.vb. O Windows Forms Designer usa a palavra-chave partial para dividir a implementação de Form1 em dois arquivos separados. Esse comportamento impede que o código gerado pelo designer sendo intercaladas com seu código.

      Para obter mais informações sobre os novos aprimoramentos linguagem Visual Basic 2005, visite o seguinte site da Web Microsoft Developer Network (MSDN): Para obter mais informações sobre classes parciais e o Windows Forms Designer, visite o seguinte site da MSDN:
  2. Siga estas etapas para adicionar o controle que você criou na seção "Create the inherited ListView control" para seu aplicativo do Windows:
    1. No menu Ferramentas , clique em Customize Toolbox .
    2. Na guia .NET Framework Components , clique em Procurar .
    3. Na caixa de diálogo Abrir , localize no controle que você criou na seção "Create the inherited ListView control" e em seguida, clique em Abrir . Isso adiciona esse controle à caixa de ferramentas para que você pode usar o controle da mesma forma para qualquer outro controle.
    4. Arraste MyListView da seção Geral da caixa de ferramentas para Form1.
  3. Arraste um controle ComboBox da seção de caixa de ferramentas da Windows Forms para Form1.
  4. Na janela Properties do ComboBox , alterar a propriedade Name para cbListViewCombo e em seguida defina a propriedade Visible como False .
  5. Adicione o seguinte código à classe do Form1 antes da seção "Windows Form Designer gerou código":
    Private lvItem As ListViewItem					
  6. Adicione o seguinte código ao evento Load do Form1.
    ' Add a few items to the combo box list.Me.cbListViewCombo.Items.Add("NC")Me.cbListViewCombo.Items.Add("WA")' Set view of ListView to Details.Me.MyListView1.View = View.Details' Turn on full row select.Me.MyListView1.FullRowSelect = True' Add some data to the ListView.Dim columnheader As ColumnHeaderDim lviewitem As ListViewItem' Create sample ListView data.lviewitem = New ListViewItem("NC")lviewitem.SubItems.Add("North Carolina")Me.MyListView1.Items.Add(lviewitem)lviewitem = New ListViewItem("WA")lviewitem.SubItems.Add("Washington")Me.MyListView1.Items.Add(lviewitem)' Create column headers for the data.columnheader = New ColumnHeader()columnheader.Text = "State Abbr."Me.MyListView1.Columns.Add(columnheader)columnheader = New ColumnHeader()columnheader.Text = "State"Me.MyListView1.Columns.Add(columnheader)' Loop through and size each column header to fit the column header text.Dim ch As ColumnHeaderFor Each ch In Me.MyListView1.Columns   ch.Width = -2Next					
  7. Adicione o seguinte código ao evento SelectedValueChanged do controle ComboBox .
    ' Set text of ListView item to match the ComboBox.lvItem.Text = Me.cbListViewCombo.Text' Hide the ComboBox.Me.cbListViewCombo.Visible = False					
  8. Adicione o seguinte código ao evento Sair do controle ComboBox .
    ' Set text of ListView item to match the ComboBox.lvItem.Text = Me.cbListViewCombo.Text' Hide the ComboBox.Me.cbListViewCombo.Visible = False					
  9. Adicione o seguinte código ao evento KeyPress do controle ComboBox .
    ' Verify that the user presses ESC.Select Case (e.KeyChar)   Case ChrW(CType(Keys.Escape, Integer))      ' Reset the original text value, and then hide the ComboBox.      Me.cbListViewCombo.Text = lvItem.Text      Me.cbListViewCombo.Visible = False   Case ChrW(CType(Keys.Enter, Integer))      ' Hide the ComboBox.      Me.cbListViewCombo.Visible = FalseEnd Select					
  10. Adicione o seguinte código ao evento MouseUp do myListView1 .
    ' Get the item on the row that is clicked.lvItem = Me.MyListView1.GetItemAt(e.X, e.Y)' Make sure that an item is clicked.If Not (lvItem Is Nothing) Then   ' Get the bounds of the item that is clicked.   Dim ClickedItem As Rectangle = lvItem.Bounds   ' Verify that the column is completely scrolled off to the left.   If ((ClickedItem.Left + Me.MyListView1.Columns(0).Width) < 0) Then      ' If the cell is out of view to the left, do nothing.      Return   ' Verify that the column is partially scrolled off to the left.   ElseIf (ClickedItem.Left < 0) Then      ' Determine if column extends beyond right side of ListView.      If ((ClickedItem.Left + Me.MyListView1.Columns(0).Width) > Me.MyListView1.Width) Then                            ' Set width of column to match width of ListView.         ClickedItem.Width = Me.MyListView1.Width         ClickedItem.X = 0      Else         ' Right side of cell is in view.         ClickedItem.Width = Me.MyListView1.Columns(0).Width + ClickedItem.Left         ClickedItem.X = 2      End If   ElseIf (Me.MyListView1.Columns(0).Width > Me.MyListView1.Width) Then      ClickedItem.Width = Me.MyListView1.Width     Else      ClickedItem.Width = Me.MyListView1.Columns(0).Width      ClickedItem.X = 2   End If   ' Adjust the top to account for the location of the ListView.   ClickedItem.Y += Me.MyListView1.Top   ClickedItem.X += Me.MyListView1.Left   ' Assign calculated bounds to the ComboBox.   Me.cbListViewCombo.Bounds = ClickedItem   ' Set default text for ComboBox to match the item that is clicked.   Me.cbListViewCombo.Text = lvItem.Text   ' Display the ComboBox, and make sure that it is on top with focus.   Me.cbListViewCombo.Visible = True   Me.cbListViewCombo.BringToFront()   Me.cbListViewCombo.Focus()End If					

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 .

Propriedades

ID do Artigo: 320342 - Última Revisão: 05/11/2007 07:08:50 - Revisão: 3.5

Microsoft Visual Basic 2005, Microsoft Visual Basic .NET 2003 Standard Edition, Microsoft Visual Basic .NET 2002 Standard Edition

  • kbmt kbvs2005swept kbvs2005applies kbhowtomaster KB320342 KbMtpt
Comentários
; m.name = "ms.dqid"; document.getElementsByTagName("head")[0].appendChild(m);