WPF  - Transferindo dados entre duas ListBox (C#)


 Neste artigo eu mostro como transferir itens entre dois controles ListBox em uma aplicação WPF usando a linguagem C#.

Quando o conteúdo de um ListView ou ListBox é apenas texto é muito fácil copiar itens entre esses controles.
 
Antes de ir para a parte prática é bom lembrar as similaridades entre o ListView e o ListBox da WPF:
Além disso um ListBox é um ItemsControl mas um ItemsControl não é um ListBox; já o ListView herda de ListBox.

Recursos usados:

Para mostrar como realizar essa tarefa crie um novo projeto no VS 2015 Community do tipo WPF Application chamada Wpf_LvLb.

Definindo a interface

Abra o arquivo  MainWindow.xaml , e, a partir da ToolBox inclua os seguintes controles:

Disponha os controles conforme o leiaute da figura abaixo:

O código XAML gerado pode ser visto a seguir:

<Window x:Class="Wpf_LvLb.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Wpf_LvLb"
        mc:Ignorable="d"
        Title="Mover Itens entre ListBox" Height="300" Width="600" Loaded="Window_Loaded">
    <Grid>
        <ListBox Margin="11,13,355,11" Name="lb1" />
        <ListBox Margin="0,13,21,11" Name="lb2" HorizontalAlignment="Right" Width="216" />
        <Button Name="btnAdicionar" Height="28" Margin="248,73,261,0" VerticalAlignment="Top"
                Click="btnAdicionar_Click">Adicionar &gt;&gt;</Button>
        <Button Name="btnRemover" Margin="248,121,261,117" 
                Click="btnRemover_Click">&lt;&lt; Remover</Button>
    </Grid>
</Window>

Vamos agora implementar o código nos eventos definidos.

Implementando o código no arquivo MainWindow.xaml.cs

Primeiro declare uma variável chamada listaDados do tipo ArrayList que iremos usar para preencher com dados, uma variável string para tratar o texto do item atual e outra variável do tipo int para tratar o índice do item atual :

ArrayList listaDados = null;
string itemAtualText;
int itemAtualIndex;
Vamos começar implementando o código no evento Window_Loaded que irá carregar os dados no ListBox - lb1.  
Para carregar os dados vamos criar um ArrayList e incluir alguns itens na lista e depois vamos vincular os itens no ListBox usando a propriedade ItemsSource:
private void Window_Loaded(object sender, RoutedEventArgs e)
 {
      // Preenche a lista com dados para exibir no listbox
      listaDados = CarregaListaDados();
      // vincula o ArrayList com o listBox
      lb1.ItemsSource = listaDados;
 }

O código do método CarregaListaDados() é dado a seguir:

    private ArrayList CarregaListaDados()
    {
         ArrayList itemsList = new ArrayList();
         itemsList.Add("Barcelona");
         itemsList.Add("Real Madrid");
         itemsList.Add("Paris Saint Germain");
         itemsList.Add("Juventus");
         itemsList.Add("Sporting");
         itemsList.Add("Borussia");
         itemsList.Add("Leverkusen");
         itemsList.Add("CSKA");
        return itemsList;
   }

Adicionando itens no ListBox

Quando o programa iniciar teremos o primeiro ListBox exibindo os itens e podemos incluir itens no segundo ListBox clicando  no botão Adicionar.

O código do evento Click desta botão esta definido a seguir:

 private void btnAdicionar_Click(object sender, RoutedEventArgs e)
 {
     // Encontra o item e obtem o seu texto e seu indice
     itemAtualText = lb1.SelectedValue.ToString();
     itemAtualIndex = lb1.SelectedIndex;
     lb2.Items.Add(itemAtualText);
    if (listaDados != null)
    {
           listaDados.RemoveAt(itemAtualIndex);
    }
    // Atualiza o data binding
    AplicarDataBinding();
 }

Neste código estamos obtendo o valor e o índice do item selecionado no Listbox lb1 e então adicionando este item no segundo Listbox lb2 e removendo o item do ArrayList.

O método AplicarDataBinding() apenas irá remover o binding atual do ListBox fazendo a revinculação dos dados com o ArrayList atualizado.

O código do método AplicarDataBinding() é visto abaixo:

    private void AplicarDataBinding()
    {
        lb1.ItemsSource = null;
       // Vincula o ArrayList ao ListBox       
       lb1.ItemsSource = listaDados;
    }

Finalmente para remover um item do Listbox lb2 clicamos no botão Remover cujo código do evento Click é dado a seguir:

   private void btnRemover_Click(object sender, RoutedEventArgs e)
    {
         // Encontrar o item o seu texto e o indice
          itemAtualText = lb2.SelectedValue.ToString();
         itemAtualIndex = lb2.SelectedIndex;
         // Adiciona o item no listbox lb2 
         listaDados.Add(itemAtualText);
         lb2.Items.RemoveAt(lb2.Items.IndexOf(lb2.SelectedItem));
       // Atualiza o data binding
        AplicarDataBinding();
  }

Neste código pegamos o valor e índice do item selecionado do Listbox lb2 e adicionamos o item no ArrayList e removemos o item do primeiro Listbox lb1.

Executando o projeto teremos:

1- O projeto carregado exibindo os itens no ListBox lb1

2- Incluindo itens no segundo Listbox lb2

3- Removendo itens do segundo ListBox lb2

Pegue o projeto completo aqui :  Wpf_LvLb.zip

"Porque as suas coisas invisíveis, desde a criação do mundo, tanto o seu eterno poder, como a sua divindade, se entendem, e claramente se vêem pelas coisas que estão criadas, para que eles fiquem inescusáveis"
Romanos 1:20

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 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

 

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

 

Referências:


José Carlos Macoratti