none
Validação dentro do DataGridview RRS feed

  • Pergunta

  • Pessoal estou usando VS2008 e C# no projeto
    Tenho um DataGridview onde existe uma coluna que contem o campo data e essa coluna podera ser alterado pelo usuario, mas estou tendo problemas para validar o conteudo pois tenho que validar se a celular não esta vazia e quando estiver preenchida preciso que o conteudo seja validado ate consegui fazer algumas validações mas hora funciona hora não funciona.

    Essa datagridview foi carregada por um DataTable, a perguntaria seria como eu faria para assim qua alterar o registro na celula da grid eu ja altere o mesmo registro no DataTable e também validar o conteudo

    Segue codigo utilizado abaixo:

     

    private void GridParcela_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
    {
    if (GridParcela.Columns[e.ColumnIndex].Index == 2)
    {
    if (string.IsNullOrEmpty(e.FormattedValue.ToString()))
    {
    MessageBox.Show("Data de vencimento em branco !", clsnegocio.sNomeSistema, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
    e.Cancel =
    true;
    }
    else if (!string.IsNullOrEmpty(e.FormattedValue.ToString()))
    {
    try
    {
    DateTime dData = Convert.ToDateTime(GridParcela[e.ColumnIndex, e.RowIndex].Value);
    }
    catch (FormatException)
    {
    MessageBox.Show("Data de vencimento invalida !", clsnegocio.sNomeSistema, MessageBoxButtons.OK, essageBoxIcon.Exclamation);
    e.Cancel =
    true;
    }
    }
    }
    }


    Junior
    sexta-feira, 31 de dezembro de 2010 10:34

Respostas

  • Junior,

    Entendi... Dando uma olhada no seu código, tenho alguns comentários a fazer:

    1) No primeiro if, ao invés de pegar o índice da coluna na grid, você já não poderia verificar se e.ColumnIndex é igual a dois? Qual foi a ideia de pegar o índice na grid para fazer a comparação?
    2) Após o if verificando se o FormattedValue é null ou empty, você não precisa de um else if... Somente um else já basta, pois, se não caiu no primeiro if que verificou se ele é null ou empty, com certeza a segunda verificação é verdadeira... Dessa forma você evita que mais uma comparação seja feita, já que ela sempre será verdadeira...
    3) Na parte que você faz o Convert.ToDateTime, ao invés de pegar o valor da grid utilizando os e.ColumnIndex e e.RowIndex, utilize o e.FormattedValue... Para funcionar precisa ser dessa forma, pois, o valor digitado só será persistido na DataGridView após o evento CellValidating...

    Resumindo, ficaria mais ou menos assim com as alterações:

    private void GridParcela_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
    {
      if (e.ColumnIndex.Equals(2))
      {
        if (string.IsNullOrEmpty(e.FormattedValue.ToString()))
        {
          MessageBox.Show("Data de vencimento em branco !", clsnegocio.sNomeSistema, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
          e.Cancel = true;
        }
        else
        {
          try
          {
            DateTime dData = Convert.ToDateTime(e.FormattedValue);
          }
          catch (FormatException)
          {
            MessageBox.Show("Data de vencimento invalida !", clsnegocio.sNomeSistema, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            e.Cancel = true;
          }
        }
      }
    }
    
    

    André Alves de Lima
    Microsoft MVP - Client App Dev
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima
    terça-feira, 4 de janeiro de 2011 11:25
    Moderador

Todas as Respostas

  • Junior,

    Qual está sendo o resultado ao utilizar esse código que você postou?


    André Alves de Lima
    Microsoft MVP - Client App Dev
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima
    segunda-feira, 3 de janeiro de 2011 18:04
    Moderador
  • Ocorre o seguinte quando eu digito uma data invalida por exemplo essa validação postada exibe a mensagem de alerta, se eu deixar a celula em branco também a validação fica OK mas quando eu ao inves de digitar uma data por exemplo digito um valor assim 123 por exemplo mesmo que depois eu acerte esse valor o programa fica exibindo a mensagem de data invalida mesmo se a celular tiver seu valor corrigido para uma data valida
    Junior
    segunda-feira, 3 de janeiro de 2011 22:32
  • Junior,

    Entendi... Dando uma olhada no seu código, tenho alguns comentários a fazer:

    1) No primeiro if, ao invés de pegar o índice da coluna na grid, você já não poderia verificar se e.ColumnIndex é igual a dois? Qual foi a ideia de pegar o índice na grid para fazer a comparação?
    2) Após o if verificando se o FormattedValue é null ou empty, você não precisa de um else if... Somente um else já basta, pois, se não caiu no primeiro if que verificou se ele é null ou empty, com certeza a segunda verificação é verdadeira... Dessa forma você evita que mais uma comparação seja feita, já que ela sempre será verdadeira...
    3) Na parte que você faz o Convert.ToDateTime, ao invés de pegar o valor da grid utilizando os e.ColumnIndex e e.RowIndex, utilize o e.FormattedValue... Para funcionar precisa ser dessa forma, pois, o valor digitado só será persistido na DataGridView após o evento CellValidating...

    Resumindo, ficaria mais ou menos assim com as alterações:

    private void GridParcela_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
    {
      if (e.ColumnIndex.Equals(2))
      {
        if (string.IsNullOrEmpty(e.FormattedValue.ToString()))
        {
          MessageBox.Show("Data de vencimento em branco !", clsnegocio.sNomeSistema, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
          e.Cancel = true;
        }
        else
        {
          try
          {
            DateTime dData = Convert.ToDateTime(e.FormattedValue);
          }
          catch (FormatException)
          {
            MessageBox.Show("Data de vencimento invalida !", clsnegocio.sNomeSistema, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            e.Cancel = true;
          }
        }
      }
    }
    
    

    André Alves de Lima
    Microsoft MVP - Client App Dev
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima
    terça-feira, 4 de janeiro de 2011 11:25
    Moderador