VB .NET - Operações com ListBox : Copiar, Colar, Cortar , Limpar, Drag and Drop


Neste artigo vou mostrar como realizar diversas operações como: recortar, copiar, colar, limpar , etc. usando o controle ListBox.

Abra o Visual Studio 2012 for Windows desktop e clique em New Project;

Clique em Visual Basic -> Windows e selecione o template Windows Forms Application informando o nome TrabalhandoListBox e clique em OK;

Inclua no formulário form1.vb os seguintes controles:

Disponha os controles no formulário conforme o leiaute abaixo:

Defina os seguintes namespaces na declaração Imports do formulário:

Imports System.Text
Imports System.Linq

A seguir defina a variável strDados como um array de strings contendo algumas strings no início do formulário:

Dim strDados As String() = New String(9) _
                                      {"Jose Carlos Macoratti", "Rio de Janeiro", "Porto Alegre", "São Paulo", "Santos", "Minas Gerais", "Santos", "Brasilia", "http://www.macoratti.net", "Lins"}

Na opção - Carregar dados - do menu Dados, inclua o código abaixo no evento Click do menu:

 Private Sub CarregarDadosToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles CarregarDadosToolStripMenuItem.Click
        For Each s In strDados
            lsb1.Items.Add(s)
        Next
    End Sub

Este código percorre o array strDados e preenche o controle ListBox (lsb1) com as strings definidas na variável strDados.

Realizando operações com ListBox

1 - Na opção - Cortar - do menu Operações defina o código abaixo para o evento Click:

Private Sub CortarToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles CortarToolStripMenuItem.Click
        Try
            'define um stringbuilder
            Dim sb As New StringBuilder()

            ' vamos usar esta coleção para manter todos os itens selecionados
            Dim selectedItemList As New List(Of Object)()

            For Each row As Object In lsb1.SelectedItems
                'adiciona ao stringbuildeer cada linha selecionada no listbox
                sb.Append(row.ToString())
                sb.AppendLine()

                ' incluindo o item selecionado em uma nova lista de objetos
                selectedItemList.Add(row)
            Next

            'remove a ultima linha do stringbuilder (vazia)
            sb.Remove(sb.Length - 1, 1)
            ' evitando copiar o último item da lista vazia
            Clipboard.SetData(System.Windows.Forms.DataFormats.Text, sb.ToString())

            ' removendo ietns elecionados a partir da listabox
            For Each ln As Object In selectedItemList
                lsb1.Items.Remove(ln)
            Next
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub

Este código corta os itens selecionados da listbox. O código já esta comentado explicando cada linha de código.

2- Opção - Copiar - do menu Operações copia os itens selecionados do listbox (lsb1):

Private Sub CopiarToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles CopiarToolStripMenuItem.Click
        Try
     
      'define um stringbuilder
            Dim sb As New StringBuilder()
          
 'adiciona ao stringbuilder cada linha selecionada no listbox
            For Each row As Object In lsb1.SelectedItems
                sb.Append(row.ToString())
                sb.AppendLine()
            Next
   
        'remove a ultima linha do stringbuilder(vazia)
            sb.Remove(sb.Length - 1, 1)
         
  ' evitar copiar a ultima linha vazia
            Clipboard.SetData(System.Windows.Forms.DataFormats.Text, sb.ToString())
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub

3- Opção - Colar - do menu Operações cola os itens selecionados para listbox (lsb1):

 Private Sub ColarToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ColarToolStripMenuItem.Click
        Try
            ' pega o texto do Clip board
            Dim s As String = Clipboard.GetText()
            ' nova linha
            Dim linhas As String() = s.Split(ControlChars.Lf)
            'cola as linhas selecionadas no listbox
            For Each ln As String In linhas
                lsb1.Items.Add(ln.Trim())
            Next
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub

4- Opção - Selecionar Tudo - do menu Operações seleciona todo os itens do Listbox(lsb1):

Private Sub SelecionarTudoToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles SelecionarTudoToolStripMenuItem.Click
        Try
         
  'limpa os itens
            lsb1.SelectedItems.Clear()
         
  'percorre os itens e seleciona todos
            For i As Integer = 0 To lsb1.Items.Count - 1
                lsb1.SetSelected(i, True)
            Next
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub

5- Opção - Limpar - Limpa os itens do Listbox

Private Sub LimparTudoToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles LimparTudoToolStripMenuItem.Click
        'limpa todos os itens
        lsb1.Items.Clear()
    End Sub

6- Opção - Drag-and-Drop - Permite arrastar e soltar itens entre os controles listbox.

Para realizar a operação de drag and drop vamos precisar de outro controle ListBox no formulário.

Inclua a partir da Toobox um novo controle ListBox com name igual a lsb2;

Defina no menu operações a opção abaixo:

O novo leiaute do formulário deverá ficar conforme a figura abaixo:

Parar implementar o recurso drag and drop vamos usar 3 eventos do controle ListBox:

A enumeração DragDropEffects especifica os possíveis efeitos de uma operação de arrastar-e-soltar (drag-and-drop). Esta enumeração tem um atributo FlagsAttribute que permite uma combinação bit a bit de seus valores de membro.

Abaixo vemos os membros da enumeração e seu significado:

All  A combinação entre os efeitos Copy, Move e Scroll.
Copy  Os dados da fonte de arrastar são copiados para o destino de soltura.
Link  Os dados da fonte de arrastar estão vinculados para o destino de soltar.
Move  Os dados da fonte de arrastar são movidos para o destino de soltura.
None  O destino de soltar não aceita os dados.
Scroll  O destino pode ser rolado enquanto arrasta para localizar uma posição de soltar não estiver visível no destino.

Além disso devemos definir a propriedade AllowDrop para True em ambos os controles de forma que eles possam aceitar os dados que forem arrastados e soltos no controle.

1- Evento MouseDown do listbox - lsb1 :

 Private Sub lsb1_MouseDown(sender As Object, e As MouseEventArgs) Handles lsb1.MouseDown
        If lsb1.Items.Count = 0 Then
            Return
        End If
        Dim index As Integer = lsb1.IndexFromPoint(e.X, e.Y)
        Dim sourceStr As String = lsb1.Items(index).ToString()
        Dim objDragDropEff As DragDropEffects = DoDragDrop(sourceStr, DragDropEffects.All)
        If objDragDropEff = DragDropEffects.All Then
            lsb1.Items.RemoveAt(lsb1.IndexFromPoint(e.X, e.Y))
        End If

    End Sub

2- Evento DragEnter do listbox lsb2:

    Private Sub lsb2_DragEnter(sender As Object, e As DragEventArgs) Handles lsb2.DragEnter
        e.Effect = DragDropEffects.All
    End Sub

3- Evento DragDrop do listbox lsb2:

  Private Sub lsb2_DragDrop(sender As Object, e As DragEventArgs) Handles lsb2.DragDrop
        Dim str As String = CStr(e.Data.GetData(DataFormats.StringFormat))
        lsb2.Items.Add(str)
    End Sub

Abaixo vemos o projeto em execução exibindo um exemplo de operação drag and drop:

Pegue o projeto completo aqui: TrabalhandoListBox.zip

João 7:6 Disse-lhes, então, Jesus: Ainda não é chegado o meu tempo; mas o vosso tempo sempre está presente.

João 7:7 O mundo não vos pode odiar; mas ele me odeia a mim, porquanto dele testifico que as suas obras são más.

Referências:


José Carlos Macoratti