Usuário com melhor resposta
Validação dentro do DataGridview

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
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- Sugerido como Resposta AndreAlvesLimaModerator quinta-feira, 6 de janeiro de 2011 12:04
- Marcado como Resposta AndreAlvesLimaModerator quinta-feira, 13 de janeiro de 2011 18:11
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 -
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 -
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- Sugerido como Resposta AndreAlvesLimaModerator quinta-feira, 6 de janeiro de 2011 12:04
- Marcado como Resposta AndreAlvesLimaModerator quinta-feira, 13 de janeiro de 2011 18:11