none
problemas com listbox pegando dados a partir de um bd local RRS feed

  • Pergunta

  • Ola pessoal, 

    Meu problema é que eu ao jogar minha lista de itens que eu peguei no bd e jogar num listbox, para cada item da lista fique num button a lista inteira esta ficando num botão só. Gostaria de ter cada item num botão separado.

    meu código xaml está assim:

    <Grid Grid.Row="1">
                <ListBox Height="183"
                         Width="469"
                         HorizontalAlignment="Right"
                         VerticalAlignment="Top"
                         Name="FileListBox">
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <HyperlinkButton Name="FileNameLinkButton"
                                             Content="{Binding}"
                                             Click="FileNameLinkButton_Click"/>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>

    em c#:

    private void bindList()
            {
                IList<lista_compra> listas = this.getvdm();
                StringBuilder texto = new StringBuilder();
                foreach (Codigo_civil p in listas)
                {
                    texto.AppendLine(p.Idtxt);
                }
                FileListBox.Items.Add(texto.ToString());
            }

    ai fica a lista toda dentro de um HyperlinkButton só fica tipo um botaozão, e eu estou usando o sql metal pra gerar o código do banco de dados.

    grato a todos!

    quarta-feira, 3 de outubro de 2012 19:13

Todas as Respostas

  • Everaldo,

    o problema é que você está deixando seu listbox pronto para o binding do que vier (através da sua linha Content= {Binding}), e está o fazendo somente uma vez, através da linha firelistbox.items etc...

    O que precisa primeiroa é dar uma boa olhada no conceito de binding e como isso acontece, pois sinto que não entendeu ainda ao certo. A minha explicação resolve esse problema atual, mas sugiro que dê uma olhada, vai te ajudar nas próximas, ok?

    No seu caso, uma das saídas é o seguinte:

    altere o contente do hyperlink para:
    Content="{Binding Idtxt}"

    Você está "falando" que quer que o controle em questão receba o campo Idtxt.

    no code behind, faça o método que retorna sua lista, ou seu ienumerable, caso ainda tenha uma query, enfim , o método que for conter seus dados, apontar para o items source dO LISTBOX, não item a item. isso não é necessário.

    FileListBox.ItemSource = getvdm ou seja lá o método que retornar os dados.

    Dessa forma você está dizendo que sua lista recebe os dados e , no xaml, que o controle tal faz o binding para tal campo. fica claro?

    Há outras formas de obter o mesmo resultado, assim como pode trabalhar com formas diferentes em relação à como vai trazer isso, mas se fizer isso, já resolve seu problema atual. Depois dê uma pesquisada em datacontext, modos de fazer isso por controle, por página, verifique as observable collections, entenda como pode tirar proveito e se isso cabe em sue projeto!

    grande abraço! 


    Rodolpho Marques do Carmo Microsoft MVP - Windows Phone Development @rodocarmo http://www.conexaowindows.com http://www.rodolphomarques.com http://www.windowsphonebrasil.net

    quinta-feira, 4 de outubro de 2012 12:21
    Moderador
  • Ficou claro sim, ontem eu consegui fazer de outro jeito, foi assim:

    private void bindList()
            {
                IList<lista_compra> listas = this.getvdm();
                StringBuilder texto = new StringBuilder();
                foreach (Codigo_civil p in listas)
                {
                    this.FileListBox.Items.Add(p.Idtxt);
                }
            }

    ficou item por item, mas eu gostaria muito de saber outras alternativas, pq acho que num caso mais complexo vou ter problemas, se vc Rodolpho puder me passar alguma fonte legal sobre o assunto eu agradeço!

    Abraços!

    quinta-feira, 4 de outubro de 2012 14:15
  • o problema na forma como está fazendo é estar criando item a item, programaticamente, através de um foreach que, fatalmente, irá demorar para ser concluído.

    isso é bastante diferente em termos de performance do que simplesmente fazer um binding direto de uma collection para um controle, que nesse caso é apenas uma informação de que a COLEÇÃO X vais er mostradad no LISTBOX Y.

    dê uma olhada nesse artigo do Jesse Liberty, ele mostra o binding , notify property changed, two way binding (algo que e bacana caso queira que seus dados voltem ao banco, modificados por ex.), data contexto etc..
    http://msdn.microsoft.com/en-us/magazine/hh852595.aspx


    Rodolpho Marques do Carmo Microsoft MVP - Windows Phone Development @rodocarmo http://www.conexaowindows.com http://www.rodolphomarques.com http://www.windowsphonebrasil.net

    quinta-feira, 4 de outubro de 2012 14:50
    Moderador
  • E mais uma pergunta, como eu faço para por exemplo passar para uma outra página o content do botão clicado, ou outro dado da mesma linha do meu banco de dados???

    Obrigado pela ajuda! Sou novo na programação!


    quinta-feira, 4 de outubro de 2012 18:42
  • sem problemas, Everaldo, estamos aqui para isso!

    Dá uma lida no link que acho que entenderá mais, mas a ideia é que seu controle (ou múltiplos, ou página, etc) terá um contexto de dados recebidos, dados esses que você atribui fazendo o items source = dados.
    ou seja,seu controle PODE (não quer dizer que vai) mostrar todo e qualquer dado dessa sua lista.

    O data template dentro do item template significa, da forma que montou, que para todo item da lista, você ter um hyperlink com um content = "{Binding campodesejado}".

    No fim, isso significa que automaticamente será gerado uma lista com N linhas e para cada linha, irá colocar no hyperlink o campo x.

    não há necessidade do foreach, o binding da lista inteiro está pronto automaticamente.

    Sobre passar para a próxima pagina, procure por "selection chenged" , um evento da lista. é uma das formas de fazer, mas é sempre bom olhar cada cenário.

    Com o selection changed você , ao ser disparado o evento , poderá obter o item selecionado e ir para uma outra página.


    Agora, minha pergunta é: seu hyperlink só é um hyperlink por estar pensando em enviar para uma outra página? nesse caso, não precisa. pode ser um textblock, faça o binding como está fazendo...Mesmo assim poderá clicar e selecionar o item.

    Não esquece de marcar a resposta como válida se te ajudou! e caso tenha mais duvidas , separadas, sobre hyperlink, navigation, vamos abrir outra questão, para não misturar muito para o pessoal que for procurar depois!
    espero que a parte da lista e binding pelo menos já esteja ok!!


    Rodolpho Marques do Carmo Microsoft MVP - Windows Phone Development @rodocarmo http://www.conexaowindows.com http://www.rodolphomarques.com http://www.windowsphonebrasil.net

    quinta-feira, 4 de outubro de 2012 20:40
    Moderador