none
inserir linha no datagridview a cada select feito RRS feed

  • Pergunta

  • Saudações.

    Tenho uma consulta de cada produto, a cada consulta é retornado um produto e jogado no datagridview.

    Só que meu problema está ai, na primeira consulta ele traz certinho, quando faço a segunda ele sobrescreve a consulta anterior.

    Quero com que a cada consulta, gere uma linha no datagridview e consequentemente gravar tudo que está no datagridview no banco. 

    Mas o meu problema no momento é inserir esses produtos e não gravar no banco.

    abaixo segue o meu codigo, faço o projeto em tres camadas.

         if (e.KeyCode == Keys.Enter) 
                {
                    dgvItemVenda.DataSource = objProdutoBO.selecionarUmProduto(txtCodProduto.Text);
         }


     
    quinta-feira, 11 de junho de 2015 16:40

Respostas

  • Olá Gustavo,

    o erro está na lógica, se você não comparar se já existe no DataTable, antes de inserir, o registro será inserido várias vezes mesmo.

    Segue o seu código com algumas alterações, acredito que vai funcionar.

    private DataTable dt = null;
     
    public void criarDataTable() 
    {
    	dt = new DataTable();
    
    	DataColumn dc;
    	dc = new DataColumn();
    	dc.ColumnName = "ID";
    	dc.DataType = typeof(int);
    	dc.AutoIncrement = true;
    	dc.AutoIncrementSeed = 1;
    	dc.AutoIncrementStep = 1;
    	dt.Columns.Add(dc);
    
    	dc = new DataColumn();
    	dc.DataType = Type.GetType("System.String");
    	dc.ColumnName = "codigoproduto";
    	dt.Columns.Add(dc);
    
    	dc = new DataColumn();
    	dc.DataType = Type.GetType("System.String");
    	dc.ColumnName = "descricao";
    	dt.Columns.Add(dc);
    
    	dc = new DataColumn();
    	dc.DataType = Type.GetType("System.String");
    	dc.ColumnName = "medida";
    	dt.Columns.Add(dc);
    
    	dc = new DataColumn();
    	dc.DataType = Type.GetType("System.String");
    	dc.ColumnName = "valorunit";
    	dt.Columns.Add(dc);
    
    	dc = new DataColumn();
    	dc.DataType = Type.GetType("System.String");
    	dc.ColumnName = "pontosproduto";
    	dt.Columns.Add(dc);
    
    }
     
    private void txtCodProduto_KeyDown(object sender, KeyEventArgs e)
    {
    	DataTable dtTemp = null;
    	DataRow dr;
    	Produto itemProduto;
    
    	if (e.KeyCode == Keys.Enter) 
    	{
    		try
    		{
    			if (dt == null) {
    				criarDataTable();
    			}
    		
    			Npgsql.NpgsqlConnection con = new Npgsql.NpgsqlConnection();
    			con.ConnectionString = @"";
    			con.Open();
    			StringBuilder sb = new StringBuilder();
    			sb.Append("SELECT codigoproduto, descricao, medida, valorUnit, pontosProduto FROM Produto WHERE codigoProduto = " + txtCodProduto.Text);
    			Npgsql.NpgsqlCommand cmd = new Npgsql.NpgsqlCommand(sb.ToString(), con);
    			Npgsql.NpgsqlDataAdapter da = new Npgsql.NpgsqlDataAdapter(cmd);
    			// Preencher um DataTable Temporário
    			da.Fill(dtTemp);
    			
    			// Verificar se o DataTable possui algum registro
    			if (dtTemp != null && dtTemp.Rows.Count > 0) {
    				// Verificar se o DataTable principal não possui o código informado.
    				if (dt.Select("codigoproduto = " + txtCodProduto.Text).Length == 0) {
    					dt.Rows.Add(dtTemp.Rows[0]);
    				}
    			}
    	   
    			dgvItemVenda.DataSource = dt;
    		}
    		catch (Exception ex)
    		{
    			MessageBox.Show(ex.Message);
    		}  
    	}
    }


    Att, Lucio Rogerio


    Espero ter ajudado, se ajudei, por favor "Vote como Útil", e se resolvi seu problema, clique em "Propor como Resposta".

    • Marcado como Resposta Gustavo.Henrique terça-feira, 16 de junho de 2015 04:24
    terça-feira, 16 de junho de 2015 02:16

Todas as Respostas

  •  Você teria que usar um forech da sua grindview para que ele faça o Update no banco.

     foreach (DataGridViewRow row in DGDADOS.Rows)
     {
          string codigo = DGDADOS.Rows[row.Index].Cells[0].Value.ToString();
          string valor = DGDADOS.Rows[row.Index].Cells[5].Value.ToString();
                                cmd.CommandText = "update seu banco set precoven = '" + valor.Replace(',', '.') + "'where codpro ='" + codigo + "' and areavend = '2295739'";
                                cmd.ExecuteNonQuery();
                                cmd = conx.CreateCommand();
    
     }

    quinta-feira, 11 de junho de 2015 19:09
  • Helder, eu não quero atualizar.

    Quero que a cada consulta de um produto ele seja adicionado no datagridview, só isso!

    Por exemplo, consulto 5 produtos, então o datagridview terá 5 linhas.

    No meu caso agora ele não tá add e sim passando por cima a cada consulta.

    quinta-feira, 11 de junho de 2015 19:56
  • Gustav, bom dia!

    É provável que a solução já está com você.

    Se a sua pesquisa já preenche uma linha é só você altera lá  sua logica para adicionar.

    Tem varias formar de fazer isso.

    segunda-feira, 15 de junho de 2015 12:47
  • Opa. Helder.

    Conseguir fazer de um mode diferente, ele está adicionando porem duplicadamente.

     

    Segue o código:

     

    private DataTable dt = null;

     

    public void criarDataTable() 
            {
                dt = new DataTable();
     
                DataColumn dc;
                dc = new DataColumn();
                dc.ColumnName = "ID";
                dc.DataType = typeof(int);
                dc.AutoIncrement = true;
                dc.AutoIncrementSeed = 1;
                dc.AutoIncrementStep = 1;
                dt.Columns.Add(dc);
     
                dc = new DataColumn();
                dc.DataType = Type.GetType("System.String");
                dc.ColumnName = "codigoproduto";
                dt.Columns.Add(dc);
     
                dc = new DataColumn();
                dc.DataType = Type.GetType("System.String");
                dc.ColumnName = "descricao";
                dt.Columns.Add(dc);
     
                dc = new DataColumn();
                dc.DataType = Type.GetType("System.String");
                dc.ColumnName = "medida";
                dt.Columns.Add(dc);
     
                dc = new DataColumn();
                dc.DataType = Type.GetType("System.String");
                dc.ColumnName = "valorunit";
                dt.Columns.Add(dc);
     
                dc = new DataColumn();
                dc.DataType = Type.GetType("System.String");
                dc.ColumnName = "pontosproduto";
                dt.Columns.Add(dc);
     
            }
     
    private void txtCodProduto_KeyDown(object sender, KeyEventArgs e)
            {
                DataRow dr;
                Produto itemProduto;
     
                if (e.KeyCode == Keys.Enter) 
                {
                    try
                    {
                        Npgsql.NpgsqlConnection con = new Npgsql.NpgsqlConnection();
                        con.ConnectionString = @"";
                        con.Open();
                        StringBuilder sb = new StringBuilder();
                        sb.Append("SELECT codigoproduto, descricao, medida, valorUnit, pontosProduto FROM Produto WHERE codigoProduto = " + txtCodProduto.Text);
                        Npgsql.NpgsqlCommand cmd = new Npgsql.NpgsqlCommand(sb.ToString(), con);
                        Npgsql.NpgsqlDataAdapter da = new Npgsql.NpgsqlDataAdapter(cmd);
                        da.Fill(dt);
                        itemProduto = new Produto();
                        dr = dt.NewRow();
                        dr["codigoproduto"] = itemProduto._codigoProduto;
                        dr["descricao"] = itemProduto._descricao;
                        dr["medida"] = itemProduto._medida;
                        dr["valorunit"] = itemProduto._valorUnit;
                        dr["pontosproduto"] = itemProduto._pontosProduto;
     
                        dt.Rows.Add(dr);
                   
                        dgvItemVenda.DataSource = dt;
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                    }  
                }

            }

    Alguma luz do que possa ser esse erro?

    terça-feira, 16 de junho de 2015 01:18
  • Tenta comentar essa linha e ve se dá certo.

    dt.Rows.Add(dr);

    Se só comentar não resolver, tente mais isso.

    dgvItemVenda.DataSource = null;
    dgvItemVenda.DataSource = dt;


    terça-feira, 16 de junho de 2015 01:46
  • Só uma dúvida, pode ser insignificante mas o que vc quer dizer com "comentar"?
    terça-feira, 16 de junho de 2015 02:04
  • Opa, Lúcio. Desde já agradeço a paciência.

    Alterei o seu código nesta parte, coloquei o construtor do metodo.

    // Preencher um DataTable Temporário
                            dtTemp = new DataTable();
                            da.Fill(dtTemp);

    Está aparecendo o mesmo erro de antes: ESTA LINHA JA PERTENCE A OUTRA TABELA!

    To emperrado nesse erro tem uns 5 ou 6 dias já.

    terça-feira, 16 de junho de 2015 04:00
  • Lúcio, consegui com esse código aqui!

                       

       if (dt == null)
                        {
                            criarDataTable();
                        }

                            Npgsql.NpgsqlConnection con = new Npgsql.NpgsqlConnection();
                            con.ConnectionString = @"";
                            con.Open();
                            StringBuilder sb = new StringBuilder();
                            sb.Append("SELECT codigoproduto, descricao, medida, valorUnit, pontosProduto FROM Produto WHERE codigoProduto = " + txtCodProduto.Text);
                            Npgsql.NpgsqlCommand cmd = new Npgsql.NpgsqlCommand(sb.ToString(), con);
                            Npgsql.NpgsqlDataAdapter da = new Npgsql.NpgsqlDataAdapter(cmd);
                            // Preencher um DataTable Temporário
                            dtTemp = new DataTable();
                            da.Fill(dt);

    // Verificar se o DataTable possui algum registro
               if (dt != null && dt.Rows.Count == 0) 
                            {
                                dt.Rows.Add(dtTemp.Rows[0]);
                            }

                            dgvItemVenda.DataSource = dt;

    OBRIGADO!


    • Editado Gustavo.Henrique terça-feira, 16 de junho de 2015 04:24 ERRO
    • Sugerido como Resposta Mr. GMSOFT terça-feira, 16 de junho de 2015 11:41
    terça-feira, 16 de junho de 2015 04:24