1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

C# DataDridView Procurar e substituir

Discussão em 'Programação' iniciada por afvnr, 10 de Abril de 2008. (Respostas: 3; Visualizações: 2161)

  1. afvnr

    afvnr Power Member

    Boas,
    eu tenho uma datagridview com 3 colunas (qtd , nome_produto, preço), e tenho botões de produtos com variáveis definidas com o nome do produto, a qtd e o preço do produto , a medida que clico nos botões produtos adiciono itens a datagridview.

    eu quero que ao clicar nos botoes de produto, procura-se na datagridview se ja existia esse produto, e se já existir então mudava qtd para qtd + 1 e mantinha o nome do produto e multiplicava a quantidade pelo preço do produto.
    Exemplo:
    Botão sumol ;
    variáveis : qtd(int) , btn.designação(string) e btn.preço_produto(double)
    clicava uma vez e aparecia na datagridview : (1 , sumol lata , 1.00 ) qtd , nome , preço
    Clicava pela segunda vez e deveria aparecer: (2, sumol lata, 2.00)

    Vou deixar aqui o meu código, penso estar perto pois ele faz mais ao menos o que quero mas tem um erro se clicar bt1 bt1 faz exactamente o que quero , agora se clicar bt1 e depois outro botão por exemplo bt2 e depois bt1 já não faz o que quero...
    Deixo o código para tentarem me ajudar obrigado

    Código:
    
    private void btn_produtos_click(object sender, EventArgs e)
            {
                botaoproduto btn = new botaoproduto();
                btn = (botaoproduto)sender;
    
                int qtdnew;
                int count;
                string compar;
                qtdnew = 0;
    
    
    
                count = dtgrid_Produtos.RowCount;
                if (count < 1)
                {
                    qtd = 1;
                    nome = btn.Designacao;
                    preco = btn.PrecoProduto;
                    dtgrid_Produtos.Rows.Insert(0, qtd, nome, preco);
    
                }
                else
                {
                    for (int i = 0; i < count; i++)
                    {
                        qtdnew = Convert.ToInt32(dtgrid_Produtos.Rows[i].Cells[0].Value);
                        index = dtgrid_Produtos.Rows[i].Index;
                     
                        compar = dtgrid_Produtos.Rows[i].Cells[1].Value.ToString();
                        if (compar == btn.Designacao)
                        {
                            qtdnew += 1;
                            nome = compar;
                            preco = qtdnew * btn.PrecoProduto;
                            dtgrid_Produtos.Rows[index].SetValues(qtdnew, nome, preco);
                            
                            break;
                        }
                        else
                        {
                            qtd = 1;
                            nome = btn.Designacao;
                            preco = btn.PrecoProduto;
                            flag = false;
                            dtgrid_Produtos.Rows.Insert(0, qtd, nome, preco);
                            break;
                        }
    
                    }
    
    
                }
    
    
     
  2. alfinete

    alfinete Power Member

    Código:
    Imports System.Data
    Imports System.Data.SqlClient
    Imports trata_sql
    Imports System.Net.Mail
    
    Partial Class _Default
        Inherits System.Web.UI.Page
    
        Dim aprovador, produto, descricao, data_req As String
        Dim cod_ped, id_aprovador, id_produto, _
            quant, quantidade_prod As Integer
        Dim data_aceit As DateTime
    
    
       
        Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            If Page.IsPostBack Then
    
                Dim rnd As New Random
                Dim auxRnd As Integer
                Dim bt As Button
                Dim auxHiddenArgument As HiddenField
    
                For Each row As GridViewRow In Me.GridView_pendentes.Rows
                    auxRnd = rnd.Next()
    
                    bt = CType(row.FindControl("Btnactualizar"), Button)
                    auxHiddenArgument = CType(row.FindControl("auxHiddenArgument_pend"), HiddenField)
                    bt.CommandArgument = auxRnd
                    auxHiddenArgument.Value = auxRnd
    
                Next
    
            End If
        End Sub
    
        Protected Sub GridView_pendentes_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles GridView_pendentes.RowCommand
    
    
            If (e.CommandName = "Botaoactualizar") Then
    
                Dim auxHiddenArgument As String = ""
                'Dim nome_produto As String
    
                For Each row As GridViewRow In Me.GridView_pendentes.Rows
                    auxHiddenArgument = CType(row.FindControl("auxHiddenArgument_pend"), HiddenField).Value
    
    
                    If Not TypeOf Session("loginid") Is Object Then
                        Me.Lbl_mensagem.Text = " O seu login expirou ....... " & _
                                               vbCrLf & " Agradecia que sai-se da aplicação e volta-se a entrar "
                        Return
                    End If
    
                    If (e.CommandArgument = auxHiddenArgument) Then 'encontrou o botão k fez o pedido
    
                        'capta o nome do produto do botão clicado
                        aprovador = row.Cells(1).Text
                        produto = row.Cells(4).Text
                        cod_ped = Val(row.Cells(3).Text)
                        data_req = row.Cells(5).Text
                        data_aceit = DateTime.Now
                   
                        quant = Val(row.Cells(9).Text)
                        descricao = row.Cells(10).Text
    
                        'Dim data As String
                        'data = data_aceit.ToString("dd/MM/yyyy hh:mm:ss:ms")
    
    
                        'guarda id do utilizador
                        id_aprovador = procura_id_utilizador(aprovador)
                        'guarda id do produto
                        id_produto = procura_id_produto(produto)
                        ' guarda a quantidade do produto existente em stock
                        quantidade_prod = procura_quant_prod(id_produto)
    
                        Me.Lbl_mensagem.Visible = True
                        Me.Lbl_mensagem.Text = "" & quant
    
    
    
                        If quant <= quantidade_prod Then
    
                            ' guardar um novo registo com estado = 2 ( aceite/entregue ) 
    
    
                            Dim ligacao_stock As SqlConnection = New SqlConnection(str_ligacao)
    
                            Dim inserir_sql_stock As String = " Insert into TabPedido( " & _
                                         " IdUtilizador,IdProduto,DataHora,Quantidade,codigo,Estado) " & _
                                         " values (@IdUtilizador,@IdProduto,@DataHora,@Quantidade,@codigo,@Estado)"
    
                            Dim comando As SqlCommand = New SqlCommand(inserir_sql_stock, ligacao_stock)
    
                            '   cria as variaveis tipo sql parameter associadas aos respectivos tipos
                            Dim IdUtilizador As SqlParameter = New SqlParameter("@IdUtilizador", SqlDbType.Int)
                            Dim IdProduto As SqlParameter = New SqlParameter("@IdProduto", SqlDbType.Int)
                            Dim DataHora As SqlParameter = New SqlParameter("@DataHora", SqlDbType.DateTime)
                            Dim Quantidade As SqlParameter = New SqlParameter("@Quantidade", SqlDbType.Int)
                            Dim Codigo As SqlParameter = New SqlParameter("@Codigo", SqlDbType.Int)
                            Dim Estado As SqlParameter = New SqlParameter("@Estado", SqlDbType.Int)
    
                            IdUtilizador.Value = id_aprovador
                            IdProduto.Value = id_produto
                            DataHora.Value = data_aceit
                            Quantidade.Value = quant
                            Codigo.Value = cod_ped
                            Estado.Value = 2
    
    
    
                            comando.Parameters.Add(IdUtilizador)
                            comando.Parameters.Add(IdProduto)
                            comando.Parameters.Add(DataHora)
                            comando.Parameters.Add(Quantidade)
                            comando.Parameters.Add(Codigo)
                            comando.Parameters.Add(Estado)
                            ligacao_stock.Open()
                            '  retorna o número de registros afetados pela instrução SQL
                            Dim num As Integer = comando.ExecuteNonQuery
                            If num = 1 Then
    
                                Me.Lbl_mensagem.Visible = True
                                Me.Lbl_mensagem.Text = "Pedido actualizado com sucesso"
    
                            Else
                                Me.Lbl_mensagem.Visible = True
                                Me.Lbl_mensagem.Text = "Erro de sistema Favor contactar o Administrador "
                            End If
    
                            ligacao_stock.Close()
    
                            ''****************************************************************************************
                            ''guardar um novo registo com estado = 4 ( entregue ) =0  
    
                            Dim ligacao_est As SqlConnection = New SqlConnection(str_ligacao)
    
                            Dim inserir_est As String = " Insert into TabPedido( " & _
                                        " IdUtilizador,IdProduto,DataHora,Quantidade,codigo,Estado) " & _
                                       " values (@IdUtilizador,@IdProduto,@DataHora,@Quantidade,@codigo,@Estado)"
    
    
                            Dim cmd_est As SqlCommand = New SqlCommand(inserir_est, ligacao_est)
    
                            '' cria as variaveis tipo sql parameter associadas aos respectivos tipos
                            Dim est_IdUtilizador As SqlParameter = New SqlParameter("@IdUtilizador", SqlDbType.Int)
                            Dim est_IdProduto As SqlParameter = New SqlParameter("@IdProduto", SqlDbType.Int)
                            Dim est_DataHora As SqlParameter = New SqlParameter("@DataHora", SqlDbType.DateTime)
                            Dim est_Quantidade As SqlParameter = New SqlParameter("@Quantidade", SqlDbType.Int)
                            Dim est_Codigo As SqlParameter = New SqlParameter("@Codigo", SqlDbType.Int)
                            Dim est_Estado As SqlParameter = New SqlParameter("@Estado", SqlDbType.SmallInt)
    
                            est_IdUtilizador.Value = id_aprovador
                            est_IdProduto.Value = id_produto
                            est_DataHora.Value = data_aceit
                            est_Quantidade.Value = 0
                            est_Codigo.Value = cod_ped
                            est_Estado.Value = 4
                            ''  insere os valores na bd
    
                            cmd_est.Parameters.Add(est_IdUtilizador)
                            cmd_est.Parameters.Add(est_IdProduto)
                            cmd_est.Parameters.Add(est_DataHora)
                            cmd_est.Parameters.Add(est_Quantidade)
                            cmd_est.Parameters.Add(est_Codigo)
                            cmd_est.Parameters.Add(est_Estado)
    
                            ligacao_est.Open()
                            ' retorna o número de registros afetados pela instrução SQL
                            Dim num2 As Integer = cmd_est.ExecuteNonQuery
    
    
                            If num2 = 1 Then
    
                                Me.Lbl_mensagem.Visible = True
                                Me.Lbl_mensagem.Text = "Pedido entregue com sucesso"
    
                            Else
                                Me.Lbl_mensagem.Visible = True
                                Me.Lbl_mensagem.Text = "Erro de sistema Favor contactar o Administrador "
                            End If
                            '******************************************
                            'update ao registo com estado=1 deste pedido
                            '*******************************************
    
    
    
                            Dim act_pend As SqlConnection = New SqlConnection(str_ligacao)
    
                            act_pend.Open()
                            Dim update_pend As String = " Update TabPedido  " & _
                                                        " set quantidade = '" & 0 & _
                                                        "' where codigo = '" & cod_ped & "' and" & _
                                                        " estado= '" & 1 & "'"
    
                            Dim cmd_pend As SqlCommand = New SqlCommand(update_pend, act_pend)
    
                            cmd_pend.ExecuteNonQuery()
    
                            act_pend.Close()
                            '***********************************
                            ' actualiza o stock do produto
                            '***********************************
    
    
                            ligacao_est.Close()
    
                            Dim novo_stock As Integer
    
                            novo_stock = quantidade_prod - quant
    
                            If novo_stock < 0 Then
                                novo_stock = 0
                            Else
                                novo_stock = novo_stock
                            End If
    
    
    
                            Dim act_stock As SqlConnection = New SqlConnection(str_ligacao)
    
                            act_stock.Open()
                            Dim update_stock As String = " Update TabProduto  " & _
                                                           " set stock = '" & novo_stock & _
                                                           "' where id = '" & id_produto & "'"
    
                            Dim cmd As SqlCommand = New SqlCommand(update_stock, act_stock)
    
                            cmd.ExecuteNonQuery()
    
                            act_stock.Close()
                            envia_mail(produto, descricao, data_req, quant, aprovador)
    
    
    
                            ' guarda um reg no historico stocks com o valor retirado em stock 
    
    
    
                            Dim ligacao_historico As SqlConnection = New SqlConnection(str_ligacao)
    
                            Dim inserir_historico As String = " Insert into tabStockhistorico( " & _
                                                "IdUtilizador, IdProduto, DataHora, Quantidade, CodigoPedido)" & _
                                                " VALUES  (@IdUtilizador, @Idproduto,GETDATE() , @Quantidade,@codigopedido)"
    
                            Dim cmd_hist As SqlCommand = New SqlCommand(inserir_historico, ligacao_historico)
    
                            '' cria as variaveis tipo sql parameter associadas aos respectivos tipos
                            Dim hist_IdUtilizador As SqlParameter = New SqlParameter("@IdUtilizador", SqlDbType.Int)
                            Dim hist_IdProduto As SqlParameter = New SqlParameter("@Idproduto", SqlDbType.Int)
                            Dim hist_Quantidade As SqlParameter = New SqlParameter("@Quantidade", SqlDbType.Int)
                            Dim hist_Codigo As SqlParameter = New SqlParameter("@Codigopedido", SqlDbType.Int)
    
    
                            hist_IdUtilizador.Value = id_aprovador
                            hist_IdProduto.Value = id_produto
                            hist_Quantidade.Value = quant
                            hist_Codigo.Value = cod_ped
                            ''  insere os valores na bd
    
                            cmd_hist.Parameters.Add(hist_IdUtilizador)
                            cmd_hist.Parameters.Add(hist_IdProduto)
                            cmd_hist.Parameters.Add(hist_Quantidade)
                            cmd_hist.Parameters.Add(hist_Codigo)
    
    
                            ligacao_historico.Open()
                            ' retorna o número de registros afetados pela instrução SQL
                            Dim num4 As Integer = cmd_hist.ExecuteNonQuery
    
    
                            If num4 = 1 Then
    
                                'Me.Lbl_mensagem.Visible = True
                                'Me.Lbl_mensagem.Text = "Pedido entregue com sucesso"
    
                            Else
                                'Me.Lbl_mensagem.Visible = True
                                'Me.Lbl_mensagem.Text = "Erro de sistema Favor contactar o Administrador "
                            End If
    
                            ligacao_historico.Close()
    
                        Else
                            Me.Lbl_mensagem.Visible = True
                            Me.Lbl_mensagem.Text = "0/A  -   " & produto & " devivo a rotura em stock não pode ser entregue"
                        End If
                        'Me.GridView_pendentes.DataBind()
    
    
                        ''*************************** não mexer *****************************************
    
                        Exit For 'forçar saida do ciclo for each da greed view
                    End If 'fim do if (If (e.CommandArgument = auxHiddenArgument))
                Next ' fim do ciclo (  For Each row As GridViewRow In GridView_requizitados.Rows)
            End If
    
    
        End Sub
    
    #Region "funçôes"
    
    
        ' procura o id de utilizador
        Function procura_id_utilizador(ByVal util As String) As Integer
    
            Dim id_util As Integer
    
            Dim ligacao_id_util As String = str_ligacao
    
            Dim Select_id_util As String = " SELECT Id FROM  TabUtilizador " & _
                                           " where TabUtilizador.nome = '" & util & "'"
    
            Dim id_util_SqlDataAdapter As SqlDataAdapter = New SqlDataAdapter(Select_id_util, ligacao_id_util)
    
    
            Dim id_util_ds As DataSet = New DataSet
    
            id_util_SqlDataAdapter.Fill(id_util_ds, "TabUtilizador")
    
            Dim id_util_DataRow As DataRow
    
            For Each id_util_DataRow In id_util_ds.Tables("TabUtilizador").Rows
                id_util = Val(id_util_DataRow("Id").ToString)
            Next
            Return id_util
    
        End Function
        ' produra o id do produto
    
        Function procura_id_produto(ByVal prod As String) As Integer
    
            Dim id_prod As Integer
    
            Dim ligacao_id_prod As String = str_ligacao
    
            Dim Select_id_prod As String = " SELECT Id FROM  Tabproduto " & _
                                           " where Tabproduto.Nome = '" & prod & "'"
    
            Dim id_prod_SqlDataAdapter As SqlDataAdapter = New SqlDataAdapter(Select_id_prod, ligacao_id_prod)
    
    
            Dim id_prod_ds As DataSet = New DataSet
    
            id_prod_SqlDataAdapter.Fill(id_prod_ds, "TabProduto")
    
            Dim id_prod_DataRow As DataRow
    
            For Each id_prod_DataRow In id_prod_ds.Tables("TabProduto").Rows
                id_prod = Val(id_prod_DataRow("Id").ToString)
            Next
            Return id_prod
    
        End Function
    
    
        ' produra o quant_prod do produto
    
        Function procura_quant_prod(ByVal id As Integer) As Integer
    
            Dim id_ As Integer
    
            Dim ligacao_quant_prod As String = str_ligacao
    
            Dim Select_quant_prod As String = " SELECT stock FROM  Tabproduto " & _
                                           " where Tabproduto.id = '" & id & "'"
    
            Dim quant_prod_SqlDataAdapter As SqlDataAdapter = New SqlDataAdapter(Select_quant_prod, ligacao_quant_prod)
    
    
            Dim quant_prod_ds As DataSet = New DataSet
    
            quant_prod_SqlDataAdapter.Fill(quant_prod_ds, "TabProduto")
    
            Dim quant_prod_DataRow As DataRow
    
            For Each quant_prod_DataRow In quant_prod_ds.Tables("TabProduto").Rows
                id_ = Val(quant_prod_DataRow("stock").ToString)
            Next
            Return id_
    
        End Function
     
        Function envia_mail(ByVal produto As String, ByVal descricao As String, _
                                ByVal data_requisicao As String, ByVal quantidade As Integer, _
                                ByVal utilizador As String) As MailMessage
    
            Dim oEmail As New MailMessage
    
            'remetente do email
    
            oEmail.From = New MailAddress("[email protected]")
    
            'destinatario do email
    
            oEmail.To.Add("[email protected]")
    
            'prioridade de envio
    
            oEmail.Priority = MailPriority.High
    
            'define o formato do email
    
            oEmail.IsBodyHtml = False
    
            'define o assunto do email
    
            oEmail.Subject = " Aceitação do pedido pendente de  -> " & produto
    
            'define a mensagem principal do email
            'Dim dentro_stock As Integer = quantidade - pendente
            oEmail.Body = " a quantidade -------------------------->  " & quantidade & " unidade/s" & _
                          vbCrLf & "que ficou pendente do/s/a/as -->  " & produto & _
                          vbCrLf & "--------------------------------------------" & _
                          vbCrLf & " Da categoria ----------------->   " & descricao & _
                          vbCrLf & " pedido em -------------------->   " & data_requisicao & _
                          vbCrLf & " devido a existencia em stock " & _
                          vbCrLf & " Brevemente lhe será entregue" & _
                          vbCrLf & " ----------------------------------------------------------" & _
                          vbCrLf & " assinado  admin :        " & utilizador
    
            'Para evitar problemas com caracteres especiais configuramos o Charset
    
            'oEmail.SubjectEncoding = ("ISO-8859-1")
    
            oEmail.BodyEncoding = Text.Encoding.GetEncoding("ISO-8859-1")
    
            'cria o objeto SMTP
    
            Dim oSmtp As New SmtpClient
            oSmtp.UseDefaultCredentials = False
    
            oSmtp.Host = "smtp.vodafone.pt"
    
    
    
            Try
    
                '   envia o email
    
                oSmtp.Send(oEmail)
    
                'Labelteste.Visible = True
                'mail_env = "Email enviado com sucesso. "
    
            Catch ex As Exception
                'Labelteste.Visible = True
                'mail_env = "Ocorreu um erro ao enviar o email : " & ex.Message
    
            Finally
    
                'limpa o objeto da memória 
    
                oEmail.Dispose()
    
            End Try
            Return oEmail
        End Function
    #End Region
    
       
    End Class
    
    

    isto esta em vb é so pasares para c#

    no page load tens de criar uma var bt para cada button.

    Código:
     bt = CType(row.FindControl("Btnactualizar"), Button)
    
    Btnactualizar - é o nome ou id do botão da grid , que me lembre

    codigo da tua grid
    depois no GridView_pendentes_RowCommand

    tens de fazer um e.comandname para cada botão

    Código:
    If (e.CommandName = "Botaoactualizar") Then
    em que command nampenso que é o comanda name que deste ao botão

    isto é a posição dos campos da tua grid

    Código:
     
    aprovador = row.Cells(1).Text
    produto = row.Cells(4).Text
    
    
    isto esta em vb2005

    é so adaptares para c#

    espero que tenha ajudado
     
  3. afvnr

    afvnr Power Member

    já ista resolvido.. :009:

    Vou deixar o código aqui pode ser necessário para alguém:


    Botão que faz adicionar valor na datagrid

    Código:
      
    private void btn_produtos_click(object sender, EventArgs e)
            {
                botaoproduto btn = new botaoproduto();
                btn = (botaoproduto)sender;
    
                bool t = false;
                int count;
                int index = 0;
                string texto = null;
    
    
    
    
                count = dtgrid_Produtos.RowCount;
    
    
    
                if (count < 1)
                {
    
                    t = false;
                    goto end;
    
                }
                else
                {
    
                    for (int i = 0; i < count; i++)
                    {
                        qtdnew = Convert.ToInt32(dtgrid_Produtos.Rows[i].Cells[0].Value);
                        texto = dtgrid_Produtos.Rows[i].Cells[1].Value.ToString();
    
                        if (texto == btn.Designacao)
                        {
                            t = true;
                            index = dtgrid_Produtos.Rows[i].Index;
                            goto end;
                        }
                    }
                }
    
            end:
    
                if (t)
                {
                    qtdnew = qtdnew + 1;
                    nome = texto;
                    preco = qtdnew * btn.PrecoProduto;
                    dtgrid_Produtos.Rows[index].SetValues(qtdnew, nome, preco);
    
                }
                else if (!t)
                {
                    t = false;
                    qtd = 1;
                    nome = btn.Designacao;
                    preco = btn.PrecoProduto;
                    dtgrid_Produtos.Rows.Insert(count, qtd, nome, preco);
    
                }
    
    
               // TOTAL += preco;
               // lbl_total.Text = TOTAL.ToString() + " €";
    
            }



    Obrigado pela ajuda na mesma ;)
     
  4. samouco

    samouco Power Member

    Boas.

    Só para dizer que deviam evitar usar "goto"

    Acredito q mesmo em VB conseguem não utilizar o goto... é simplesmente má programação, pelo menos fui ensinado assim e há 10 anos q programo sem utilizar um goto ( só em assembly :003: )
     

Partilhar esta Página