none
Alterar dados no datagridview RRS feed

  • Pergunta

  • Olá pessoal...

    No meu registro de compra eu tenho os seguintes campos: IdProduto,NomeProduto,Qantidade,ValorUnitario,Desconto e ValorTotalItem. Estes campos são os meus itens da compra e eu tenho também um botão Adicionar e um botão Remover que servem para adicionar e remover os valores desses campos em um datagridview. Eu fiz o esquema de não permitir que o mesmo item seja adicionado várias vezes, mas agora eu preciso permitir que o usuário selecione no datagridview o item desejado, altere-o e ao clicar no botão adicionar seja modificado no datagridview apenas o valor daquele campo que o usuário alterou. Segue abaixo o código onde o usuário ao selecionar determinada linha do datagridview seus valores sejam mostrados nos seus respectivos textbox

    private void dgItens_CellClick(object sender, DataGridViewCellEventArgs e)
            {
                tbxIdProduto.Text = dgItens.CurrentRow.Cells[0].Value.ToString();
                tbxProduto.Text = dgItens.CurrentRow.Cells[1].Value.ToString();
                tbxQuantidade.Text = dgItens.CurrentRow.Cells[2].Value.ToString();
                tbxValorUnitario.Text = dgItens.CurrentRow.Cells[3].Value.ToString();
                tbxDesconto.Text = dgItens.CurrentRow.Cells[4].Value.ToString();
                lblTotalItem.Text = dgItens.CurrentRow.Cells[5].Value.ToString();
            }

    Fazendo assim eu estou apenas trazendo de volta para seus respectivos textbox os valores da linha selecionada no datagridview, eu preciso agora q se eu digitar outro valor no campo Quantidade por exemplo e clicar no botão adicionar novamente seja modificado apenas o valor da coluna Quantidade no meu datagridview...

    Estou utilizando VS2008

    Obrigada

    Angelica

    terça-feira, 15 de maio de 2012 15:36

Respostas

  • invert o processo algo do tipo:

      dgItens.CurrentRow.Cells[0].Value= tbxIdProduto.Text;


    O Amor que Sinto por Ti, Apenas Deus e capaz de sentir e superar tal amor!

    terça-feira, 15 de maio de 2012 16:06
    Moderador
  • Apenas recomendo que ao utilizar esse método de alteração dos valores você fique atenta quanto ao CurrentRow, porque veja seu próprio código:

    private void dgItens_CellClick(object sender, DataGridViewCellEventArgs e) {
       tbxIdProduto.Text = dgItens.CurrentRow.Cells[0].Value.ToString();
       tbxProduto.Text = dgItens.CurrentRow.Cells[1].Value.ToString();

    Você pega diretamente o VALOR que está na Grid, referente a linha (CurrentRow) que o usuário selecionou com um CLIQUE.

    Entenda que, se ele clicar em uma célula, você irá alimentar os Text Boxes com os valores que foram capturados pelas células da linha corrente, igual está no código acima, mas imagine a seguinte situação:

    O usuário clica na célula da linha 1, assim será alimentado os Textboxes com os valores que estão na linha 1, após isso sem querer ele aperta SETA PARA BAIXO, o foco será alterado para a linha 2, mas os Textboxes tem o valor da linha 1. Porque esse evento CellClick é chamado somente quando ele CLICAR (mouse) na célula!

    Em seguida o usuário irá alterar o conteúdo dos TextBoxes (que são da linha1) ele irá clicar em GRAVAR e no momento da gravação será incluído os valores alterados da linha1 que foram alterados na linha 2 (porque o foco da Grid está na linha 2 neste momento (lembra-se da SETA para BAIXO?)

    dgItens.CurrentRow.Cells[0].Value= tbxIdProduto.Text;

    Veja que no código acima você está usando dgItens.CurrentRow que significa Linha(registro) corrente, que nesse caso é o 2 e não 1...

    Eu já fiz muitos sites assim, manipulando os dados e objetos manualmente, eu usava um DUPLO clique por exemplo para ALTERAR o valor da grid, assim após o dublo clique você poderá INATIVAR a grid (Enabled=false). Assim se o usuário clicar em outra Row(linha) nada acontecerá, porque a grid está INATIVA (Enabled=false).
    Após gravar ou cancelar os valores, você ATIVA novamente (Enabled=true).

    Não sei se ficou bem claro meu exemplo, sei que ficou redundante certos pontos, mas... hoje estou com pouquissimo tempo, caso tenha mais dúvidas faço outros exemplos pra você!

    Lembre-se que há outros meios de fazer esse procedimento comum. Usando DataBinding, etc! Assim isso não ocorrerá!


    É ajudando os outros que nos ajudamos...

    terça-feira, 15 de maio de 2012 22:26
  • Bom você tem os dados no Grid e tem um Botão adicionar, caso vc queira alterar, porque nao cria um botão separado só para ele?

    O código do botão alterar seria +- assim :

     try
                {
                    string sql = "";
                    sql += " Update TABELA ";
                    sql += " Set IdProduto= '" + tbxIdProduto.Text + "', ";
                    sql += " Produto = '" + tbxProduto.Text + "', ";
                    sql += " Quantidade = " + tbxQuantidade.Text + ", ";
                    sql += " ValorUnidade = '" +  tbxValorUnitario.Text + "', ";
                    sql += " Desconto = '" +  tbxDesconto.Text + "'";
                    sql += " Where idProduto = " + dataGridView1.CurrentRow.Cells[0].Value;
                    cx.Conectar(); //método que conecta no banco
                    SqlCommand cd = new SqlCommand();
                    cd.Connection = cx.c;
                    cd.CommandText = sql;
                    cd.ExecuteNonQuery();
                    lblStatus.Text = "Produto alterado";
                    cx.Desconectar(); //método que desconecta
                    carregaGrid();//Método que atualiza o Grid, o mesmo método que vc usa para listar nele os seus produtos que estao no banco
                }
                catch (SqlException x)
                {
                    lblStatus.Text = x.Message;
                }

    Se não der certo me avise para ajudar novamente !!


    Atenciosamente, Guilherme. Caso esta resposta foi útil para seu problema, por favor, marque como mesma. Caso ela apenas responda sua pergunta corretamente, não esqueça de marca-lá.


    quarta-feira, 16 de maio de 2012 12:02

Todas as Respostas

  • invert o processo algo do tipo:

      dgItens.CurrentRow.Cells[0].Value= tbxIdProduto.Text;


    O Amor que Sinto por Ti, Apenas Deus e capaz de sentir e superar tal amor!

    terça-feira, 15 de maio de 2012 16:06
    Moderador
  • Apenas recomendo que ao utilizar esse método de alteração dos valores você fique atenta quanto ao CurrentRow, porque veja seu próprio código:

    private void dgItens_CellClick(object sender, DataGridViewCellEventArgs e) {
       tbxIdProduto.Text = dgItens.CurrentRow.Cells[0].Value.ToString();
       tbxProduto.Text = dgItens.CurrentRow.Cells[1].Value.ToString();

    Você pega diretamente o VALOR que está na Grid, referente a linha (CurrentRow) que o usuário selecionou com um CLIQUE.

    Entenda que, se ele clicar em uma célula, você irá alimentar os Text Boxes com os valores que foram capturados pelas células da linha corrente, igual está no código acima, mas imagine a seguinte situação:

    O usuário clica na célula da linha 1, assim será alimentado os Textboxes com os valores que estão na linha 1, após isso sem querer ele aperta SETA PARA BAIXO, o foco será alterado para a linha 2, mas os Textboxes tem o valor da linha 1. Porque esse evento CellClick é chamado somente quando ele CLICAR (mouse) na célula!

    Em seguida o usuário irá alterar o conteúdo dos TextBoxes (que são da linha1) ele irá clicar em GRAVAR e no momento da gravação será incluído os valores alterados da linha1 que foram alterados na linha 2 (porque o foco da Grid está na linha 2 neste momento (lembra-se da SETA para BAIXO?)

    dgItens.CurrentRow.Cells[0].Value= tbxIdProduto.Text;

    Veja que no código acima você está usando dgItens.CurrentRow que significa Linha(registro) corrente, que nesse caso é o 2 e não 1...

    Eu já fiz muitos sites assim, manipulando os dados e objetos manualmente, eu usava um DUPLO clique por exemplo para ALTERAR o valor da grid, assim após o dublo clique você poderá INATIVAR a grid (Enabled=false). Assim se o usuário clicar em outra Row(linha) nada acontecerá, porque a grid está INATIVA (Enabled=false).
    Após gravar ou cancelar os valores, você ATIVA novamente (Enabled=true).

    Não sei se ficou bem claro meu exemplo, sei que ficou redundante certos pontos, mas... hoje estou com pouquissimo tempo, caso tenha mais dúvidas faço outros exemplos pra você!

    Lembre-se que há outros meios de fazer esse procedimento comum. Usando DataBinding, etc! Assim isso não ocorrerá!


    É ajudando os outros que nos ajudamos...

    terça-feira, 15 de maio de 2012 22:26
  • Bom você tem os dados no Grid e tem um Botão adicionar, caso vc queira alterar, porque nao cria um botão separado só para ele?

    O código do botão alterar seria +- assim :

     try
                {
                    string sql = "";
                    sql += " Update TABELA ";
                    sql += " Set IdProduto= '" + tbxIdProduto.Text + "', ";
                    sql += " Produto = '" + tbxProduto.Text + "', ";
                    sql += " Quantidade = " + tbxQuantidade.Text + ", ";
                    sql += " ValorUnidade = '" +  tbxValorUnitario.Text + "', ";
                    sql += " Desconto = '" +  tbxDesconto.Text + "'";
                    sql += " Where idProduto = " + dataGridView1.CurrentRow.Cells[0].Value;
                    cx.Conectar(); //método que conecta no banco
                    SqlCommand cd = new SqlCommand();
                    cd.Connection = cx.c;
                    cd.CommandText = sql;
                    cd.ExecuteNonQuery();
                    lblStatus.Text = "Produto alterado";
                    cx.Desconectar(); //método que desconecta
                    carregaGrid();//Método que atualiza o Grid, o mesmo método que vc usa para listar nele os seus produtos que estao no banco
                }
                catch (SqlException x)
                {
                    lblStatus.Text = x.Message;
                }

    Se não der certo me avise para ajudar novamente !!


    Atenciosamente, Guilherme. Caso esta resposta foi útil para seu problema, por favor, marque como mesma. Caso ela apenas responda sua pergunta corretamente, não esqueça de marca-lá.


    quarta-feira, 16 de maio de 2012 12:02
  • Angelica, somente um comentário, não estou corrigindo nada sobre a postagem do SERATTI, ele está correto, sabemos que ele fez um exemplo rápido para você entender, na prática usamos diversos meios para fazer esse tipo de tarefa...
    Mas há detalhes que fazem bastante diferença quando temos uma aplicação de média e alta escalabilidade!

    Quando há muitas concatenizações, como nesse caso:

    string sql = "";
     sql += " Update TABELA ";
     sql += " Set IdProduto= '" + tbxIdProduto.Text + "', ";
     sql += " Produto = '" + tbxProduto.Text + "', ";
     sql += " Quantidade = " + tbxQuantidade.Text + ", ";
     sql += " ValorUnidade = '" +  tbxValorUnitario.Text + "', ";
     sql += " Desconto = '" +  tbxDesconto.Text + "'";
     sql += " Where idProduto = " + dataGridView1.CurrentRow.Cells[0].Value;

    É recomendado utilizar por exemplo a classe StringBuilder do namespace System.Text porque o String é um objeto imutável. Sempre que você use um dos métodos na System.String classe, você cria um novo objeto de seqüência de caracteres na memória, que requer uma nova alocação de espaço para esse novo objeto. Em situações onde você precisa realizar modificações repetidas uma seqüência de caracteres, a sobrecarga associada à criação uma nova String o objeto pode ser caro. A classe System.Text.StringBuilder pode ser utilizada quando você desejar modificar uma sequência de caracteres sem criar um novo objeto. Por exemplo, usando o StringBuilder classe pode melhorar o desempenho ao concatenar várias cadeias de caracteres juntos em um loop.

    Mais detalhes sobre a classe StringBuilder:
    http://msdn.microsoft.com/pt-br/library/system.text.stringbuilder.aspx

    Outras demonstrações de uso:
    http://www.macoratti.net/10/09/c_ocod1.htm
    http://dicasdecodigo.blogspot.com.br/2008/02/classe-stringbuilder.html
    http://www.devmedia.com.br/otimizando-c-com-stringbuilder/22852
    http://blog.computero.com.br/stringbuilder-x-stringbuffer/


    Outro detalhe é sobre o tratamento de Erros (Exceptions) que no exemplo está:

    catch (SqlException x) {
      lblStatus.Text = x.Message;
    }

    SqlException é lançada quando SQL Server retorna um aviso ou erro. 
    http://msdn.microsoft.com/pt-br/library/system.data.sqlclient.sqlexception.aspx

    As vezes devemos fazer mais que um catch  para tratar erros de diversas origens...
    Como SqlException para tratar erros do Banco, Exception para tratar erros de concatenização da string SQL que está usando! Assim você pode retornar para o usuário informações mais especificas sobre o que ocorreu...


    É ajudando os outros que nos ajudamos...


    • Editado Terra Jr quarta-feira, 16 de maio de 2012 19:26
    • Sugerido como Resposta Seratti quarta-feira, 16 de maio de 2012 20:45
    quarta-feira, 16 de maio de 2012 19:22