Usuário com melhor resposta
Porque o DataTable não sinaliza que teve alteração?

Pergunta
-
Senhores
Tenho um DataAdapter que preenche(Fill) um DataTable que, por sua vez serve de DataSource em um DataGridView.
Usando o código abaixo e atualizo uma célula do DataGridView com um valor.
msg = string.Empty;
foreach (DataRow dr in this.DS.Tables[0].Rows)
{
msg += string.Format("valor = '{0} {1} {2}'{3}", dr["GrupoID"], dr["DespesaID"], dr["Valor"], nl);
}
MessageBox.Show(msg);O MessageBox acima mostra uma lista de Rows do DataTable conectado ao DataGridView
Nessa Lista, todos os valores estão iguais aos da tabela que originou os dados exibidos no DataGridView.
Isso é o comportamento esperado pois, até este momento nada foi modificado.
msg = this.DS.HasChanges().ToString();
MessageBox.Show(msg);
O MessageBox acima mostra False, o que tem sentido pois os valores não foram modificados.
// Atualiza o campo de despesa
cell.Value = valDec;
Supostamente no comando acima eu atualizei o DatGridView pois 'cell' é um campo do dataGridView(acreditem, por favor)
msg = string.Empty;
foreach (DataRow dr in this.DS.Tables[0].Rows)
{
msg += string.Format("valor = '{0} {1} {2}'{3}", dr["GrupoID"], dr["DespesaID"], dr["Valor"], nl);
}
MessageBox.Show(msg);
O MessageBox acima mostra uma lista de rows do DataTable associado ao DataGridView, semelhante à anteriormente mostrada
Nessa lista, porém, a coluna da row correspondente à célula modificada aparece com o novo valor a ela atribuida acima
msg = this.DS.HasChanges().ToString();
MessageBox.Show(msg);Curiosamente o MessageBox acima mostra False, também, o que NÃO tem sentido pois os valores JÁ foram modificados.
Alguém pode me indicar porque ocorre esta aparente contradição?
Grato
Homero
Homero OM
- Editado HomeroOM segunda-feira, 5 de fevereiro de 2018 10:59
Respostas
-
Homero OM,
Sim, peço mais detalhe porque achei um trecho muito curto de código que você colocou para as pessoas analizarem aqui.Desculpe, pensei nisso e depois coloquei um exemplo de "btnAlterar" (daProdutos.Update(dsProdutos);).
Por favor, você colocou seu código:msg = this.DS.HasChanges().ToString(); MessageBox.Show(msg);
Em outros trecho do código para ver se muda para "True" em algum lugar?
Obrigado,
Fabio I.- Marcado como Resposta Filipe B CastroModerator sexta-feira, 23 de fevereiro de 2018 17:06
Todas as Respostas
-
Boa tarde, HomeroOM. Tudo bem?
Você conseguiu algum avanço no caso?
Você recebe alguma mensagem de erro, ou algo assim?
Atenciosamente,Filipe B de Castro
Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita
MSDN Community Support
Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.
-
-
Homero OM,
Estou fazendo uns testes aqui...
... peguei um exemplo do Macoratti e modifiquei:
------------------------------------------------------------
C# - ADO .NET para iniciantes V - SqlDataAdapter e DataSet
http://www.macoratti.net/09/05/c_adn_5.htm------------------------------------------------------------
private void btnIncluir_Click(object sender, EventArgs e) { string msg = ""; daProdutos = new SqlDataAdapter("SELECT ProductID, ProductName FROM Products", conn); SqlCommandBuilder cmdbldr = new SqlCommandBuilder(daProdutos); dsProdutos = new DataSet(); daProdutos.Fill(dsProdutos); DataRow registro = dsProdutos.Tables[0].NewRow(); registro["ProductName"] = "Macoratti_"; //NESTE PONTO APARECEU "FALSE" msg = this.dsProdutos.HasChanges().ToString(); MessageBox.Show(msg); dsProdutos.Tables[0].Rows.Add(registro); //NESTE PONTO APARECEU "TRUE" msg = this.dsProdutos.HasChanges().ToString(); MessageBox.Show(msg); //atualiza o dataset daProdutos.Update(dsProdutos); MessageBox.Show("Registro incluido."); }
ANTES de fazer o "ADD" apareceu "False", mas depois do "ADD" apareceu "TRUE"...
... e o "ADD" vem antes da atualização do "DataSet" (Update).
private void btnAlterar_Click(object sender, EventArgs e) { string msg = ""; daProdutos = new SqlDataAdapter("SELECT ProductID, ProductName FROM Products order by ProductID", conn); SqlCommandBuilder cmdbldr = new SqlCommandBuilder(daProdutos); dsProdutos = new DataSet(); daProdutos.Fill(dsProdutos); DataColumn[] chave = new DataColumn[1]; chave[0] = dsProdutos.Tables[0].Columns[0]; dsProdutos.Tables[0].PrimaryKey = chave; codigo = dgvProdutos.CurrentRow.Cells["ProductID"].Value.ToString(); if (codigo != null || !codigo.Equals("")) { DataRow registro = dsProdutos.Tables[0].Rows.Find(codigo); //NESTE PONTO APARECEU "FALSE" msg = this.dsProdutos.HasChanges().ToString(); MessageBox.Show(msg); registro["ProductName"] = registro["ProductName"] + " # "; //NESTE PONTO APARECEU "TRUE" msg = this.dsProdutos.HasChanges().ToString(); MessageBox.Show(msg); daProdutos.Update(dsProdutos); MessageBox.Show("Registro alterado."); } else { MessageBox.Show("Registro não localizado."); } }
No caso da atualização o "TRUE" apareceu antes da atualização do registro.
Por favor, pode me passar mais detalhes?
Obrigado,
Fabio I.
- Editado Fabio I sábado, 3 de fevereiro de 2018 20:25
- Sugerido como Resposta Lucio Rogerio SPBanned domingo, 4 de fevereiro de 2018 00:19
-
Fabio
Você pede mais detalhes.
Nas respostas anteriores está o código que usei.
Grato pela colaboração mas me permita assinalar que o teu exemplo é referente a um insert no DataGridView.
O meu exemplo é uma alteração em uma coluna de um determinado row, portanto um Update.
Isso deve fazer muita diferença no caso.
Grato, mais uma vex
Homero
Homero OM
-
Homero OM,
Sim, peço mais detalhe porque achei um trecho muito curto de código que você colocou para as pessoas analizarem aqui.Desculpe, pensei nisso e depois coloquei um exemplo de "btnAlterar" (daProdutos.Update(dsProdutos);).
Por favor, você colocou seu código:msg = this.DS.HasChanges().ToString(); MessageBox.Show(msg);
Em outros trecho do código para ver se muda para "True" em algum lugar?
Obrigado,
Fabio I.- Marcado como Resposta Filipe B CastroModerator sexta-feira, 23 de fevereiro de 2018 17:06
-
Fábio
Mais uma vez grato pela intervenção.
O código, inteiro, está colocado na primeira mensagem dessa thread.
Para simplificar o entendimento, acabei de edita-la e colocar o código em negrito para diferenciá-lo dos comentários.
Vais ver que existe uma verificação da propriedade HasChanges antes e depois da atribuição que modifica a variável do DataGridView.
Grato pela atenção.
Homero
Homero OM