none
Soma de células e de colunas em um GridView RRS feed

  • Pergunta

  • Bom dia, 

    Estou com algumas dificuldades para utilizar o GridView. Tenho a seguinte tabela: Nome/Quantidade/Preço Unitario/Preço(que deve ser a multiplicação da quantidade pelo preço total). E no final um rodapé com o preço total que dever ser a soma de toda a coluna "Preço Unitario".

    Já vi vários exemplos na net de como somar as colunas mas nenhum me ajudou. Todos pelo mesmo problema, exemplo:

    Tentei usando um 

    foreach (GridViewRow row in gvList.Rows)

    e dentro eu simplesmente faço a conversão dos textos que deveriam esta nas células, assim: 

                    decimal preco = decimal.Parse(row.Cells[2].Text);
                    int qtde = Int32.Parse(row.Cells[3].Text);
                    totalGeral += preco * qtde;

    O problema é que a propriedade Text sempre vem vazia! Então da erro na hora que o programa tenta converter para inteiro ou para decimal.

    Grato pela ajuda.

    sexta-feira, 3 de maio de 2013 13:16

Respostas

  • Bom dia !
    Depure a página e veja se os campos estão vindos vazios. Se estiver, é esse o problema. Então use o isnull em seu select. O Isnull vai garantir que todo o campo vazio seja convertido para 0. Um exemplo: select isnull(preco, 0) as preco

    Abraço e se foi útil, por favor, clique em marcar como resposta.


    Evandro Aguiar
    http://agenciawebpro.com.br

    Farei o possível, para ajudar. Caso eu consiga, marque minha resposta como útil e me faça feliz. :) hauhauhauhauh

    sexta-feira, 3 de maio de 2013 14:38
  • Bom dia,

    Qual o problema no seu caso, você está utilizando o ItemTemplate, mas não está criando um webcontrol dentro dele, por isso ao tentar ler os dados o grid não encontra o valor de suas coluna, existem 2 maneiras de resolver isto:

    Utilizar o BoundField, a sua coluna ficaria assim:

     <asp:BoundField DataField="Preco" HeaderText="Preço Total" />

    Ai você pode continuar fazendo a leitura da sua maneira:

     decimal preco = decimal.Parse(gvList.Rows[0].Cells[4].Text);

    Ou criar o web control no itemTemplate, a sua coluna ficaria assim (eu acho melhor desta maneira):

    <asp:TemplateField HeaderText="Preço Unitario">
                    <HeaderStyle Width="120px" />
                    <ItemStyle HorizontalAlign="Center" />                
                    <ItemTemplate>
                    <asp:Label ID="lblPreco" runat="server" Text='<%# Eval("Preco") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>

                decimal preco = decimal.Parse(((Label)gvList.Rows[0].FindControl("lblPreco")).Text);


    Att,
    Leandro

    Se foi útil, marque como útil ou como resposta.

    sábado, 4 de maio de 2013 13:15

Todas as Respostas

  • o problema esta no seu select na coluna que pode ter vazio faça assim

    select isnull(campo,'0') as campo ou select isnull(campo,'') as campo


    Junior

    sexta-feira, 3 de maio de 2013 14:31
  • Bom dia !
    Depure a página e veja se os campos estão vindos vazios. Se estiver, é esse o problema. Então use o isnull em seu select. O Isnull vai garantir que todo o campo vazio seja convertido para 0. Um exemplo: select isnull(preco, 0) as preco

    Abraço e se foi útil, por favor, clique em marcar como resposta.


    Evandro Aguiar
    http://agenciawebpro.com.br

    Farei o possível, para ajudar. Caso eu consiga, marque minha resposta como útil e me faça feliz. :) hauhauhauhauh

    sexta-feira, 3 de maio de 2013 14:38
  • Obrigado pelas respostas!

    Seguinte, eu sei que nenhum campo do meu grid esta vazio. Pois já executei a pagina sem essa função de somar as colunas e todas estão vindo certinho.

    Estou carregando os dados no grid dessa forma: 

    <asp:GridView ID="gvList" runat="server" AutoGenerateColumns="false" AllowPaging="true" PageSize="10"
            DataKeyNames="ID">
    
            <Columns>
                <asp:TemplateField HeaderText="Produto">
                    <HeaderStyle Width="400px" />
                    <ItemStyle HorizontalAlign="Center" />                
                    <ItemTemplate><%# Eval("NomeProduto") %></ItemTemplate>
                </asp:TemplateField>
    
                <asp:TemplateField HeaderText="Quantidade">
                    <HeaderStyle Width="80px" />
                    <ItemStyle HorizontalAlign="Center" />                
                    <ItemTemplate><%# Eval("Quantidade") %></ItemTemplate>
                </asp:TemplateField>
    
                <asp:TemplateField HeaderText="Preço Unitario">
                    <HeaderStyle Width="120px" />
                    <ItemStyle HorizontalAlign="Center" />                
                    <ItemTemplate><%# Eval("Preco") %></ItemTemplate>
                </asp:TemplateField>
    
                <asp:TemplateField HeaderText="Preço Total">
                    <HeaderStyle Width="160px" />
                    <ItemStyle HorizontalAlign="Center" />
                    <ItemTemplate><%#Eval("SubTotal") %></ItemTemplate>
                </asp:TemplateField>
    
            </Columns>
    
        </asp:GridView>

    Quando percorro o grid com o foreach que mencionei e executo a pagina me da o seguinte erro:

    Detalhes da Exceção: System.FormatException: A cadeia de caracteres de entrada não estava em um formato incorreto.

    Linha 60:             {
    Linha 61:                 // converte o preco e a qtde para multiplicar e somar no total
    Linha 62:                 decimal preco = decimal.Parse(row.Cells[2].Text);
    Linha 63:                 int qtde = Int32.Parse(row.Cells[3].Text);
    Linha 64:                 totalGeral += preco * qtde;

    quando seto um breakpoint nessa linha eu vejo que a propriedade Text esta vazia... Mas como disse se tiro essa linha de código que da erro e executo a pagina os campos do grid estão preenchidos normal como disse.

    Grato!

    • Editado RBaraldi sexta-feira, 3 de maio de 2013 14:57
    sexta-feira, 3 de maio de 2013 14:53
  • vc executou o select e viu se em alguma linha do result o campos preco está vazio sem valor ?

    Com certeza o erro é esse veja no design da sua tabela se o campo valor está como decimal


    Junior

    sexta-feira, 3 de maio de 2013 15:11
  • Desculpe minha ignorância mas não sei verificar isso. Comecei a mexer com ASP.NET faz uma semana.

    Com relação a tabela, sim, o campo preço esta como decimal.

    Grato,

    sexta-feira, 3 de maio de 2013 15:26
  • Veja na sua aplicação qual consulta vc está fazendo no BD para preencher o gridview copie essa consulta e execute no server manager(se for sql) ou faça a mesma consulta direto no banco ou se a tabela nao tem muitos registros veja os registros, certamente tem alguma linha que o campo preco está vazio.

    Junior

    sexta-feira, 3 de maio de 2013 16:09
  • Um dica n pegue o campo pelo cell com indice fixo, use o findcontrol 

    Não esqueça de usar o componente </> na barra para posta seu código. Microsoft MCPD,MCTS,MCC

    sexta-feira, 3 de maio de 2013 16:10
    Moderador
  • a tabela tem 3 registros...

    estou fazendo assim: 

    gvList.DataSource = _carrinho.Buscar_Produto(session);

    Esse métodos Buscar_Produto é o seguinte: 

    public List<carrinho> Buscar_Produto(string _session)
            {
                var dados = from p in _contexto.carrinho
                            //where p.IDSession == _session
                            select p;
    
                return dados.ToList();
    
            }

    Todos os registos contêm o campo Preço: 

    SELECT TOP 1000 [ID]
          ,[IDSession]
          ,[IDProduto]
          ,[Preco]
          ,[Quantidade]
          ,[NomeProduto]
          ,[SubTotal]
      FROM [LojaVirtual].[dbo].[carrinho]

    ID - IDSession - IDProduto - Preco - Quantidade - NomeProduto - SubTotal
    44 - kpnhitgqlauuxdbl0e5itj11 - 3 - 78.00 - 20 - Rosso di Montalcino  -1560
    45 - uociradn4nqkdrdvhpz3msyz - 4 - 199.00 - 7 - Champagne Taittinger - 1393
    46 - 5dgadv3t0eq2wdvn3xcb4j54 - 5 - 68.00 - 3 - Equus  - 204

    Essa seria minha tabela

    • Editado RBaraldi sexta-feira, 3 de maio de 2013 16:49
    sexta-feira, 3 de maio de 2013 16:46
  • Como assim? Poderia me explicar melhor? 

    Grato,

    sexta-feira, 3 de maio de 2013 16:49
  • Faz assim ao invés de vc colocar convert.toDecimal coloca convert.toString()

    Junior

    sexta-feira, 3 de maio de 2013 16:57
  • Ok, assim não da mais o erro, mas a string vem vazia. assim: ""

    sexta-feira, 3 de maio de 2013 18:00
  • Bom dia,

    Qual o problema no seu caso, você está utilizando o ItemTemplate, mas não está criando um webcontrol dentro dele, por isso ao tentar ler os dados o grid não encontra o valor de suas coluna, existem 2 maneiras de resolver isto:

    Utilizar o BoundField, a sua coluna ficaria assim:

     <asp:BoundField DataField="Preco" HeaderText="Preço Total" />

    Ai você pode continuar fazendo a leitura da sua maneira:

     decimal preco = decimal.Parse(gvList.Rows[0].Cells[4].Text);

    Ou criar o web control no itemTemplate, a sua coluna ficaria assim (eu acho melhor desta maneira):

    <asp:TemplateField HeaderText="Preço Unitario">
                    <HeaderStyle Width="120px" />
                    <ItemStyle HorizontalAlign="Center" />                
                    <ItemTemplate>
                    <asp:Label ID="lblPreco" runat="server" Text='<%# Eval("Preco") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>

                decimal preco = decimal.Parse(((Label)gvList.Rows[0].FindControl("lblPreco")).Text);


    Att,
    Leandro

    Se foi útil, marque como útil ou como resposta.

    sábado, 4 de maio de 2013 13:15
  • Desculpe a demora para responder, tinha parado com esse projeto por um tempo.

    Então cara, fiz como você disse, adicionei o label dento do intemTemplate, funcionou certinho!

    Muito obrigado!

    terça-feira, 21 de maio de 2013 15:38