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: