none
Porque o DataTable não sinaliza que teve alteração? RRS feed

  • 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
    quinta-feira, 1 de fevereiro de 2018 16:55

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.

    segunda-feira, 5 de fevereiro de 2018 10:18

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.

    sexta-feira, 2 de fevereiro de 2018 16:14
    Moderador
  • Filipe

    Não, não recebi nenhuma luz sobre o problema.

    Não há mensagem de erro.

    Tudo parece funcionar.

    Exceto pelas evidências coletadas, que apontam o problema que está, aparentemente. ocorrendo.

    Homero


    Homero OM

    sábado, 3 de fevereiro de 2018 14:43
  • 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.

    sábado, 3 de fevereiro de 2018 20:13
  • 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

    domingo, 4 de fevereiro de 2018 22:40
  • 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.

    segunda-feira, 5 de fevereiro de 2018 10:18
  • 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

    segunda-feira, 5 de fevereiro de 2018 11:03