locked
Montando uma lista RRS feed

  • Pergunta

  • Bom dia
    No wcf eu pego um item e seus detalhes e jogo no itemsource de um datagrid. Ate aqui tranquilo.
    Mas se eu pegar um segundo item e jogar no datagris ele irá substituir o primeiro. Então como manter o primeiro item la na lista??

        <OperationContract()> _
        Public Function SELECIONA_MOLDURAS(ByVal CODMOLDURAS As Integer) As List(Of MOLDURAS)
            Dim CONEXAO As String = ConnectionStrings("MyCon").ConnectionString
            Dim DBariel As New MySqlConnection(CONEXAO)
            Dim TBselmolduras As New MySqlCommand("Select PD.CODIGO,PL.ID,PD.DESCRICAO,PD.UND,1 as QTDE,PL.VALOR from MOLDURAS as PL,PRODUTOS as PD where PD.CODIGO=PL.COD_PRODUTO and PL.CODIGO=@CODMOLDURAS", DBariel)
    
            TBselmolduras.Parameters.AddWithValue("@CODMOLDURAS", CODMOLDURAS)
    
            Dim ADAPTADOR As New MySqlDataAdapter(TBselmolduras)
            Dim DADOS As New DataTable
    
            ADAPTADOR.Fill(DADOS)
    
            Dim LISTA As New List(Of MOLDURAS)
            For I As Integer = 0 To DADOS.Rows.Count - 1
    
                LISTA.Add(New MOLDURAS With {.CODIGO = Convert.ToInt32(DADOS.Rows(I)("CODIGO")) _
                                             , .REFERENCIA = Convert.ToString(DADOS.Rows(I)("ID")) _
                                             , .DESCRICAO = Convert.ToString(DADOS.Rows(I)("DESCRICAO")) _
                                             , .UNIDADE = Convert.ToString(DADOS.Rows(I)("UND")) _
                                             , .QUANTIDADE = Convert.ToInt32(DADOS.Rows(I)("QTDE")) _
                                             , .PAGAMENTO = "0" _
                                             , .VUNITARIO = Convert.ToDouble(DADOS.Rows(I)("VALOR")) _
                                             , .VTOTAL = Convert.ToDouble(DADOS.Rows(I)("VALOR"))})
    
            Next
    
            Return LISTA.ToList
    
        End Function
    quinta-feira, 14 de maio de 2009 13:47

Respostas

  • Olá Junior. Agora acredito que entendi o que você precisa...

    É possível fazer isto com List. A questão é tratar no momento que você popula seu datagrid. Abaixo segue um exemplo que fiz. Cada vez que chamo a função CarregaDados() ele popula o grid com o conteúdo já existente e o novo conteúdo. Mas tenho que criar um List para armazenar estes items.

    ServiceReference1.Service1Client wcf = new AdicionadandoItemAoList.ServiceReference1.Service1Client();
            
            //List onde irei armazenar meus todos os dados. O tipo deste list deverá ser relativo ao
            //tipo de dados retornado. No meu caso estou retornando um objeto Produto dentro do meu WCF
            //referenciado com o nome ServiceReference1. "adicionandoItemAoList" é o nome do meu projeto.
            List<AdicionadandoItemAoList.ServiceReference1.Produto> lst = new List<AdicionadandoItemAoList.ServiceReference1.Produto>();
    
            public Page()
            {
                InitializeComponent();
                Loaded += new RoutedEventHandler(Page_Loaded);
            }
    
            void Page_Loaded(object sender, RoutedEventArgs e)
            {
                CarregaDados();
            }
    
            private void CarregaDados()
            {
                wcf.SelectCompleted +=
                    new EventHandler<AdicionadandoItemAoList.ServiceReference1.SelectCompletedEventArgs>(wcf_SelectCompleted);
                wcf.SelectAsync();
            }
    
            void wcf_SelectCompleted(object sender, AdicionadandoItemAoList.ServiceReference1.SelectCompletedEventArgs e)
            {
                for (int i = 0; i < e.Result.Count; i++)
                {
                    //crio um objeto chamado item para armazenar cada linha do meu e.result(). Este item tem que
                    //ser do mesmo tipo de dados da minha List.
                    AdicionadandoItemAoList.ServiceReference1.Produto item = 
                        new AdicionadandoItemAoList.ServiceReference1.Produto();
    
                    //atribuo o e.result ao item
                    item = e.Result[i];
    
                    //adiciono o item a minha list
                    lst.Add(item);
                }
    
                //Limpo e populo novamente o datagrid
                dttDados.ItemsSource = null;
                dttDados.ItemsSource = lst;
            }
    
            private void btn_Click(object sender, RoutedEventArgs e)
            {
                CarregaDados();
            }

    Desta forma, toda vez irei adicionar novos itens a minha List e nunca irei perder o valor recebido anteriormente.

    Quanto ao profile, irei pesquisar se é possível...

    Espero ter ajudado.
    Abraços.

    "Se sua pergunta foi respondida, por favor, marque como resposta"

    • Marcado como Resposta Jjunior75 terça-feira, 19 de maio de 2009 01:27
    segunda-feira, 18 de maio de 2009 11:53

Todas as Respostas

  • Olá Júnior.

    Deixa eu ver se eu entendi o seu caso: Você está fazendo um select no banco e retornando uma lista. Então você faz um select em outra tabela, retornando uma lista também e quer mostrar no mesmo DataGrid. Estou certo?

    Se sim, basta você retornar apenas uma lista no WCF com os conteúdos das duas tabelas. Fiz um exemplo com duas tabelas de Produtos. Veja se te ajuda:

    DataClassesDataContext db = new DataClassesDataContext();
    
            [OperationContract]
            public List<Produto> Select()
            {
                //Faço o select em uma tabela e coloco o resultado em um List
                var SelecionarProduto = from rows
                                        in db.Produtos
                                        select rows;
                
                List<Produto> lstProduto = new List<Produto>();
                lstProduto = SelecionarProduto.ToList();
    
                //Faço o select em outra tabela e coloco o resultado em outro List
                var SelecionarProduto1 = from rows
                                         in db.Produto1s
                                         select rows;
                
                List<Produto1> lstProduto1 = new List<Produto1>();
                lstProduto1 = SelecionarProduto1.ToList();
    
                //Adiciona o resultado do Segundo List no primeiro
                for (int i = 0; i < lstProduto1.Count; i++)
                {
                    //crio o objeto Produto
                    Produto objProduto = new Produto();
    
                    //atribuo o campo Nome do segundo List no objeto Produto
                    objProduto.Nome = lstProduto1[i].Nome;
    
                    //Adiciono o objeto produto ao List da primeira tabela
                    lstProduto.Add(objProduto);
                }
    
                return lstProduto;
            }

    Ou se você precisa criar apenas a lista, basta usar a estrutura for para adicionar os campos.

    Abraços.

    "Se sua pergunta foi respondida, por favor, marque como resposta"

    sexta-feira, 15 de maio de 2009 12:03
  • Blz Lucas
    Na verdade o q estou fazendo é o seguinte. Faço um select e retorno ele por uma lista e jogo essa lista no datagrid. Depois que retornou faço outro select retorno pela mesma lista e jogo no mesmo datagrid. O que esta acontecendo é que esta substituindo o primeiro resultado na datagrid. Após o segundo select ao invés de ter 2 linhas no datagris eu so tenho 1 ( a ultima select retornada) Mas acho que dessa forma que vc fez ai funciona, vou testar aqui.

    Vc sabe me dizer se Silverlight funciona com Profile?? E se n for perguntar demais se profile funciona no Mysql??

    Obrigado
    sexta-feira, 15 de maio de 2009 22:10
  • é não funciona, ele sempre substitui o ultimo registro da lista
    Será que com profile eu consigo fazer??
    segunda-feira, 18 de maio de 2009 00:53
  • Olá Junior. Agora acredito que entendi o que você precisa...

    É possível fazer isto com List. A questão é tratar no momento que você popula seu datagrid. Abaixo segue um exemplo que fiz. Cada vez que chamo a função CarregaDados() ele popula o grid com o conteúdo já existente e o novo conteúdo. Mas tenho que criar um List para armazenar estes items.

    ServiceReference1.Service1Client wcf = new AdicionadandoItemAoList.ServiceReference1.Service1Client();
            
            //List onde irei armazenar meus todos os dados. O tipo deste list deverá ser relativo ao
            //tipo de dados retornado. No meu caso estou retornando um objeto Produto dentro do meu WCF
            //referenciado com o nome ServiceReference1. "adicionandoItemAoList" é o nome do meu projeto.
            List<AdicionadandoItemAoList.ServiceReference1.Produto> lst = new List<AdicionadandoItemAoList.ServiceReference1.Produto>();
    
            public Page()
            {
                InitializeComponent();
                Loaded += new RoutedEventHandler(Page_Loaded);
            }
    
            void Page_Loaded(object sender, RoutedEventArgs e)
            {
                CarregaDados();
            }
    
            private void CarregaDados()
            {
                wcf.SelectCompleted +=
                    new EventHandler<AdicionadandoItemAoList.ServiceReference1.SelectCompletedEventArgs>(wcf_SelectCompleted);
                wcf.SelectAsync();
            }
    
            void wcf_SelectCompleted(object sender, AdicionadandoItemAoList.ServiceReference1.SelectCompletedEventArgs e)
            {
                for (int i = 0; i < e.Result.Count; i++)
                {
                    //crio um objeto chamado item para armazenar cada linha do meu e.result(). Este item tem que
                    //ser do mesmo tipo de dados da minha List.
                    AdicionadandoItemAoList.ServiceReference1.Produto item = 
                        new AdicionadandoItemAoList.ServiceReference1.Produto();
    
                    //atribuo o e.result ao item
                    item = e.Result[i];
    
                    //adiciono o item a minha list
                    lst.Add(item);
                }
    
                //Limpo e populo novamente o datagrid
                dttDados.ItemsSource = null;
                dttDados.ItemsSource = lst;
            }
    
            private void btn_Click(object sender, RoutedEventArgs e)
            {
                CarregaDados();
            }

    Desta forma, toda vez irei adicionar novos itens a minha List e nunca irei perder o valor recebido anteriormente.

    Quanto ao profile, irei pesquisar se é possível...

    Espero ter ajudado.
    Abraços.

    "Se sua pergunta foi respondida, por favor, marque como resposta"

    • Marcado como Resposta Jjunior75 terça-feira, 19 de maio de 2009 01:27
    segunda-feira, 18 de maio de 2009 11:53