C# DataDridView Procurar e substituir

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;
                    }

                }


            }
 
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
 
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 ;)
 
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: )
 
Back
Topo