Usuário com melhor resposta
inserir linha no datagridview a cada select feito

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);
}
- Editado Gustavo.Henrique quinta-feira, 11 de junho de 2015 16:41 erro
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(); }
-
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.
-
-
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?
-
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;
- Editado Bruno Maschio Joaquim terça-feira, 16 de junho de 2015 01:48
-
-
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á.
-
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