C# - ListBox :  Rearranjando itens


Hoje veremos como podemos rearranjar os itens em um controle ListBox usando C#.

Antes de iniciar cabe um alerta que a abordagem mostrada neste artigo não é a única e somente é indicada quando você tiver poucos itens a serem exibidos no ListBox. 

No exemplo apresentando iremos exibir itens em um ListBox e permitir que o usuário selecione um item e usando botões de comando será possível rearranjar a posição do item na lista para cima e/ou para baixo.

Vamos la´...

recursos usados:

  • Visual Studio 2019

Criando o projeto Windows Forms no VS 2019 Community

Abra o VS 2019 e no menu File clique em New Project e selecione o template : Aplicativo do Windows Forms(.NET Framework) e clique em Próximo:

Informe o nome CShp_ListBox1 e clique em Criar.

No formulário Form1.cs inclua um controle ListBox alterando o seu nome para lstbLinguagens e a seguir inclua 5 buttons : btnTopo, btnAcima, btnAbaixo e btnBase dispondo os controles no formulário conforme a figura abaixo:

Para incluir os itens no listbox vamos usar a propriedade Items e na janela do Editor de Coleção vamos incluir os nomes das 20 linguagens de programação mais usadas:

Agora vamos definir o código do formulário:

1- Quando o usuário selecionar um item do ListBox no evento SelectedIndexChanged temos o código que vai habilitar e desabilitar os botões apropriados:
 
 private void lstbLinguagens_SelectedIndexChanged(object sender, EventArgs e)
  {
            btnAcima.Enabled = (lstbLinguagens.SelectedIndex > 0);
            btnTopo.Enabled = btnTopo.Enabled;
            btnAbaixo.Enabled = (lstbLinguagens.SelectedIndex < lstbLinguagens.Items.Count - 1);
            btnBase.Enabled = btnAbaixo.Enabled;
 }

Se o índice selecionado for maior que 0 (o primeiro item possui o índice 0), o item não estará no topo da lista. Nesse caso, o código ativa os botões Mover para cima e Mover o topo.

Se o índice selecionado for menor que o número de itens menos um (o último item possui o índice
lstbLinguagens.Items.Count - 1), o item não estará no final da lista. Nesse caso, o código ativa os botões Mover para baixo e Mover para a base.

Depois de mover o item, o botão o seleciona. Isso é menos confuso do que não deixar nenhum item selecionado, permite que o usuário clique nos botões várias vezes para mover o item repetidamente e garante que o item permaneça visível se sair da parte inferior ou superior da lista visível.

A abordagem básica que cada botão usa para mover o item selecionado é a mesma: salve o índice do item, se necessário, salve o item, remova o item do listbox e insira o item em sua nova posição.

A seguir o código de cada botão de comando :

1- Move o item para o Topo da lista
 
        private void btnTopo_Click(object sender, EventArgs e)
        {
            object item = lstbLinguagens.SelectedItem;
            lstbLinguagens.Items.RemoveAt(lstbLinguagens.SelectedIndex);
            lstbLinguagens.Items.Insert(0, item);
            lstbLinguagens.SelectedIndex = 0;
        }

2- Move o item para cima na lista
 
 private void btnAcima_Click(object sender, EventArgs e)
 {
    int index = lstbLinguagens.SelectedIndex;
    object item = lstbLinguagens.SelectedItem;
    lstbLinguagens.Items.RemoveAt(lstbLinguagens.SelectedIndex);
    lstbLinguagens.Items.Insert(index - 1, item);
    lstbLinguagens.SelectedIndex = index - 1;
 }

3- Move o item para baixo na lista
 
 private void btnAbaixo_Click(object sender, EventArgs e)
  {
            int index = lstbLinguagens.SelectedIndex;
            object item = lstbLinguagens.SelectedItem;
            lstbLinguagens.Items.RemoveAt(lstbLinguagens.SelectedIndex);
            lstbLinguagens.Items.Insert(index + 1, item);
            lstbLinguagens.SelectedIndex = index + 1;
 }

4- Move o item para a base da lista
   
 private void btnBase_Click(object sender, EventArgs e)
 {
            object item = lstbLinguagens.SelectedItem;
            lstbLinguagens.Items.RemoveAt(lstbLinguagens.SelectedIndex);
            lstbLinguagens.Items.Add(item);
            lstbLinguagens.SelectedIndex = lstbLinguagens.Items.Count - 1;
 }

5- Encerra o projeto
 
 private void btnEncerrar_Click(object sender, EventArgs e)
 {
     Application.Exit();
 }

Executando o projeto teremos o resultado a seguir:

Pegue o projeto completo aqui: WF_ListBox1.zip

"Bendito seja o Deus e Pai de nosso Senhor Jesus Cristo, o Pai das misericórdias e o Deus de toda a consolação;
Que nos consola em toda a nossa tribulação, para que também possamos consolar os que estiverem em alguma tribulação, com a consolação com que nós mesmos somos consolados por Deus."
2 Coríntios 1:3,4
 

Referências:


José Carlos Macoratti