WPF - Copiando itens entre os controles ListView


Neste artigo veremos como copiar itens selecionados entre controles ListView em uma aplicação WPF.

A WPF (Windows Presentantion Fundation)  é uma tecnologia que se propõe ser uma alternativa ao modelo Windows Forms, e, em se tratando de recursos a WPF vai além.

Quando você decide trabalhar com a WPF existem muitos conceitos básicos que você precisa conhecer para saber o que esta acontecendo por "trás dos panos".

Para criar aplicações WPF você pode usar qualquer versão do Visual Studio superior ao Visual Studio 2008, incluindo as versões Express, e, também o SharpDevelop a partir da versão 4.0. A linguagem usada pode ser tanto o VB .NET como a linguagem C#.

De forma geral quando você começa a construir uma aplicação WPF você começa definindo a interface usando o editor XAML, mas nada impede que você inicie usando o código da linguagem escolhida, afinal, tudo o que você faz com o XAML você pode fazer também via Código.

Mas o que vem a ser XAML ?

XAML é uma linguagem de marcação baseada na linguagem XML para especificação e definição de características de classes.

XAML é utilizado principalmente para a especificação de aspectos estáticos e visual da interface do usuário através da definição propriedades de objetos da classe

  • Podemos produzir código XAML usando ferramentas de layout de interface do usuário, tais como o Expression Blend, mas podemos também definir código XAML à mão digitando diretamente as tags específicas e/ou arrastando e soltando os controles WPF a partir da ToolBox;
  • Ferramentas de layout de interface do usuário, tais como o Expression Blend são freqüentemente usados por designers gráficos ao invés de programadores;
  • A linguagem VB .NET (ou C #) é usada principalmente para especificar a maioria das partes ativas de um programa como o fluxo de controle e de manipuladores de mensagens;

Neste artigo vou mostrar como copiar itens do tipo texto entre os controles ListView.(Para o controle ListBox o procedimento é quase idêntico)

Recursos usados :

Criando a solução no VS 2013 Express Edition

Abra o VS 2013 Express for Windows desktop e clique em New Project;

A seguir selecione Visual Basic -> WPF Application

Informe o nome Wpf_CopiandoItensListView e clique no botão OK;

No arquivo MainWindow.xaml do projeto vamos incluir os seguintes controles a partir da ToolBox :

Disponha os controles conforme o leiaute da figura abaixo:

Código XAML Gerado
<Window x:Name="btnCopiarItem" x:Class="MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Copiando Itens entre ListView/ListBox" Height="360" Width="620">
    <Grid Background="Beige">
        <ListView x:Name="lv1" HorizontalAlignment="Left" Height="233" Margin="10,10,0,0" VerticalAlignment="Top" Width="316">
            <ListView.View>
                <GridView>
                    <GridViewColumn/>
                </GridView>
            </ListView.View>
        </ListView>
        <ListView x:Name="lv2" HorizontalAlignment="Left" Height="233" Margin="354,10,0,0" VerticalAlignment="Top" Width="249" RenderTransformOrigin="0.5,0.5">
            <ListView.RenderTransform>
                <TransformGroup>
                    <ScaleTransform/>
                    <SkewTransform AngleY="0.273"/>
                    <RotateTransform/>
                    <TranslateTransform Y="0.526"/>
                </TransformGroup>
            </ListView.RenderTransform>
            <ListView.View>
                <GridView>
                    <GridViewColumn/>
                </GridView>
            </ListView.View>
        </ListView>
        <Button x:Name="btnPreencherLv1" Content="Preencher ListView" HorizontalAlignment="Left" Margin="10,264,0,0" VerticalAlignment="Top" Width="116" Height="27"/>
        <TextBox x:Name="txtTexto" HorizontalAlignment="Left" Height="23" Margin="134,267,0,0" TextWrapping="Wrap" Text="Macoratti" VerticalAlignment="Top" Width="192"/>
        <Button x:Name="btnCopiarItensSelecionados" Content="Copiar Itens Selecionados" HorizontalAlignment="Left" Margin="354,263,0,0" VerticalAlignment="Top" Width="245" Height="27"/>
        <CheckBox x:Name="chkCopiarClipboard" Content="Copiar para o  ClipBoard" HorizontalAlignment="Left" Margin="233,303,0,0" VerticalAlignment="Top"/>
    </Grid>
</Window>

Vamos copiar os itens do primeiro ListView para o segundo e em seguida remover o item copiado. Também vamos definir uma opção para copiar mais de um item selecionado e uma opção para copiar os itens para o ClipBoard.

A primeira coisa que devemos fazer é preencher o primeiro ListView - Lv1- e para isso vamos definir o código no evento Click do botão - Preencher ListView -:

  Private Sub btnPreencherLv1_Click(sender As Object, e As RoutedEventArgs) Handles btnPreencherLv1.Click
        Try
            lv1.Items.Add("Brasil")
            lv1.Items.Add("Peru")
            lv1.Items.Add("Equador")
            lv1.Items.Add("Honduras")
            lv1.Items.Add("Bolivia")
            If Not String.IsNullOrWhiteSpace(txtTexto.Text) Then
                lv1.Items.Add(txtTexto.Text)
            End If
        Catch ex As Exception
            MessageBox.Show("Erro : " + ex.Message, "Erro", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try
    End Sub

Este código incluir alguns itens predefinidos no ListView e também o que for informado na caixa de texto - TxtTexto.

Agora vamos definir que quando o usuário clicar duas vezes em um item do Lv1 o item será copiado para o Lv2.

Para isso vamos usar o evento MouseDoubleClick do ListView Lv1 definindo nele o seguinte código:

 Private Sub lv1_MouseDoubleClick(sender As Object, e As MouseButtonEventArgs) Handles lv1.MouseDoubleClick
        Try
            lv2.Items.Add(lv1.SelectedItems(0).ToString())
            lv1.Items.Remove(lv1.SelectedItem.ToString())
            If chkCopiarClipboard.IsChecked Then
                Clipboard.SetText(lv1.SelectedItems(0).ToString())
            End If
        Catch ex As Exception
            MessageBox.Show("Erro : " + ex.Message, "Erro", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try
    End Sub

Este código usa o  método SelectedItem para obter o item selecionado pelo usuário e a seguir usando o método Add incluir no Lv2 e o remove do Lv1 usando o método Remove.

Verificamos se o checkbox foi marcado e definimos o código para copiar o item para o ClipBoard.

Para copiar mais de um item selecionado vamos definir no evento Click do botão - btnCopiarItensSelecionados - o código a seguir:

 Private Sub btnCopiarItensSelecionados_Click(sender As Object, e As RoutedEventArgs) Handles btnCopiarItensSelecionados.Click
        Try
            If lv1.SelectedItems.Count > 0 Then
                For Each itm As String In lv1.SelectedItems
                    lv2.Items.Add(itm.ToString)
                Next
            End If

            If chkCopiarClipboard.IsChecked Then
                If lv1.SelectedItems.Count > 0 Then
                    Dim selecao As String = ""
                    For Each itm As String In lv1.SelectedItems
                        selecao += itm.ToString & Environment.NewLine
                    Next
                    Clipboard.SetText(selecao)
                End If
            End If
        Catch ex As Exception
            MessageBox.Show("Erro : " + ex.Message, "Erro", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try
    End Sub

Para copiar o item selecionado no ListView Lv2 de volta ao Lv1 usamos o código abaixo no evento MouseDoubleClick do ListView Lv2 definindo nele o seguinte código:

 Private Sub lv2_MouseDoubleClick(sender As Object, e As MouseButtonEventArgs) Handles lv2.MouseDoubleClick
        Try
            lv1.Items.Add(lv2.SelectedItems(0).ToString())
            lv2.Items.Remove(lv2.SelectedItem.ToString())
        Catch ex As Exception
            MessageBox.Show("Erro : " + ex.Message, "Erro", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try
 End Sub

Agora executando o projeto e preenchendo o ListView Lv1 com itens após clicar duas vezes sobre os itens Honduras e Macoratti teremos o seguinte resultado:

Pegue o projeto completo aqui :  Wpf_CopiandoItensListView.zip

Disse-lhe Jesus: Estou há tanto tempo convosco, e não me tendes conhecido, Filipe? Quem me vê a mim vê o Pai; e como dizes tu: Mostra-nos o Pai?
Não crês tu que eu estou no Pai, e que o Pai está em mim? As palavras que eu vos digo não as digo de mim mesmo, mas o Pai, que está em mim, é quem faz as obras.

João 14:9,10

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti