Array
(
)

Fazer um IF de coluna Data

Jair Souza
   - 17 mar 2015

Preciso fazer "Se valor da coluna tal for igual a data", Como fazer esta parte dentro do parênteses " (DateTime...)) " :
#Código

private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            if(e.Value != null && e.Value.Equals(DateTime))
            {
                DataGridViewRow row = dataGridView1.Rows[e.RowIndex];

                row.DefaultCellStyle.ForeColor = Color.Red;

            }
        }

Randrade
   - 18 mar 2015

Explique um pouco melhor o que você precisa, pois dessa forma não está claro, e dificultando possíveis respostas.

Jair Souza
   - 18 mar 2015

Então, se o valor da coluna 3 for igual a um formato de data por exemplo assim "00/00/0000", deixar o forecolor desta LINHA de cor diferente das demais.
Agradeço o interesse em ajudar.

Jothaz
   - 18 mar 2015

Pesquise por:

DateTime.TryParse

Ou DateTime.Parse:

#Código

    string strDate = obj.ToString();
     try 
      {
            DateTime dt = DateTime.Parse(strDate);
            if(dt != DateTime.MinValue  && dt != DateTime.MaxValue)
                  return true;
            return false;
       }
       catch
        {
               return false;
         }

Thiago Santana
   - 18 mar 2015

tente utilizar o Convert.ToDateTime

Jair Souza
   - 18 mar 2015

Ainda não consegui...na imagem abaixo mostra exatamente o resultado esperado com o código que tenho...MAS, para uma data específica, como fazer para qualquer data ?

Clique na imagem para abrir em uma nova janela

Randrade
   - 18 mar 2015

Tente olhar este tutorial, se não conseguir, avise que coloco um exemplo funcional para você. Desculpe colocar apenas o link, é que estou com pouco tempo no momento.

Jair Souza
   - 18 mar 2015

É... foi deste link que comecei meu código...mesmo assim obrigado.

Thiago Santana
   - 18 mar 2015

Se for pra comparar com a data atual, basta chamar DateTime.Now

Jair Souza
   - 18 mar 2015

Não é a data atual, são datas variadas de devolução de locações...

Thiago Santana
   - 19 mar 2015

Se for Web Application utilizando Webform você deverá utilizar o método RowDataBound!
Com ele você pode capturar as informações e manipular várias coisas, se for Windows Form não lembro qual o evento correto do GridView

Jothaz
   - 19 mar 2015

Sinceramente não entendi o que você quer!

Se for quando o campo estiver preenchido deve vir vermelho senão deve ficar preto, por que você não teste null?

Ou na entrada de dados o campo data pode ser preenchido com valores que não sejam data? Se for assim, no meu ponto de vista a modelagem esta equivocada, mas como modelagem é igual fiofó cada um tem a sua kkkkkk, você pode contornar a situação usando o comando que postei DateTime.TryParse, basta ter um pouco de trabalho e criar um método para validar:

#Código



//O teste fica assim, talvez tenha de usar o .ToString, testa ai.
 if(e.Value != null && ValidaData(e.Value))



//Método para validar se o conteúdo é DateTime
private bool ValidaData(String ValorData)
{
	if (DateTime.TryParse(badInput, out dateTime2))
	{
	    return true;
	}
	else
	{
	    return false;
	}
} 


Não testei o exemplo acima, então esta passível de conter erro. É só uma ideia de como pode ser feito.

Jair Souza
   - 19 mar 2015

Inicialmente eu tinha o código assim :

#Código

 private void locacaoDataGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            for (int i = 0; i < locacaoDataGridView.Rows.Count; i++)

                if (!String.IsNullOrEmpty((string)locacaoDataGridView.Rows[i].Cells[3].Value.ToString()))
                {
                   e.CellStyle.ForeColor = Color.Red;
                }
        }


Mas assim ficam todas as linhas color.red...

Jothaz
   - 19 mar 2015


Citação:
Inicialmente eu tinha o código assim :

#Código

 private void locacaoDataGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            for (int i = 0; i < locacaoDataGridView.Rows.Count; i++)

                if (!String.IsNullOrEmpty((string)locacaoDataGridView.Rows[i].Cells[3].Value.ToString()))
                {
                   e.CellStyle.ForeColor = Color.Red;
                }
        }


Mas assim ficam todas as linhas color.red...

Você não respondeu o que perguntei! Como não sei claramente qual a regra nem conheço seu ambiente fica difícil ajudar!

O código que você postou deixar vermelho todos os campos diferentes de null ou empty.

Qual a regra que você que implementar?

Qual o conteúdo do campo?
É uma data?
Ou pode ser uma Data ou um outro valor que não seja uma data?

Se a regra para deixar vermelho for ser diferente de null/empty e deve ser uma Data válida é só implementar o código que postei.

Thiago Santana
   - 19 mar 2015

Jair acho que você está utilizando o evento errado do seu GridView!
O problema é que você está utilizando o evento CellFormatting

Jair Souza
   - 19 mar 2015


Citação:

Citação:
Inicialmente eu tinha o código assim :

#Código

 private void locacaoDataGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            for (int i = 0; i < locacaoDataGridView.Rows.Count; i++)

                if (!String.IsNullOrEmpty((string)locacaoDataGridView.Rows[i].Cells[3].Value.ToString()))
                {
                   e.CellStyle.ForeColor = Color.Red;
                }
        }


Mas assim ficam todas as linhas color.red...

Você não respondeu o que perguntei! Como não sei claramente qual a regra nem conheço seu ambiente fica difícil ajudar!

O código que você postou deixar vermelho todos os campos diferentes de null ou empty.

Qual a regra que você que implementar?

Qual o conteúdo do campo?
É uma data?
Ou pode ser uma Data ou um outro valor que não seja uma data?

Se a regra para deixar vermelho for ser diferente de null/empty e deve ser uma Data válida é só implementar o código que postei.

Primeiro desculpe se ficou confuso, recapitulando :

O campo é somente data, veja na imagem :

Clique na imagem para abrir em uma nova janela

Jair Souza
   - 19 mar 2015


Citação:
Jair acho que você está utilizando o evento errado do seu GridView!
O problema é que você está utilizando o evento CellFormatting


O evento CellFormatting é o equivalente ao RowDataBound...

Jothaz
   - 19 mar 2015

Jair,

Não quero ser chato, mas sem uma elaboração compreensível da questão fica difícil e frustante. E em TI é fundamental conhecer a regra a ser implementada senão não se chega a lugar nenhum.

Então Data de Devoluão (3 coluna do grid) é um campo data, que quando vier preenchido deve ficar vermelho do contrário deve ficar preto?

Usando:

#Código

if (!String.IsNullOrEmpty((string)locacaoDataGridView.Rows[i].Cells[3].Value.ToString()))


mesmo os registro com conteúdo em branco ficam com a linha vermelha?

Teoricamente era para funcionar!

Tente debugar e verificar qual o conteúdo do campo! Se é null ou "" e use a immediate window para fazer os testes.

Ou tente usar a função que lhe passei, pois o DateTime.TryParse valida se a data e datas em branco ou null são invalidas:
#Código
                        DateTime dateResult;
			if (DateTime.TryParse(locacaoDataGridView.Rows[i].Cells[3].Value.ToString(), out dateResult))
			{
				e.CellStyle.ForeColor = Color.Red;
			}


Teria de funcionar.

Jair Souza
   - 19 mar 2015


Citação:
Jair,

Não quero ser chato, mas sem uma elaboração compreensível da questão fica difícil e frustante. E em TI é fundamental conhecer a regra a ser implementada senão não se chega a lugar nenhum.

Então Data de Devoluão (3 coluna do grid) é um campo data, que quando vier preenchido deve ficar vermelho do contrário deve ficar preto?

Usando:

#Código

if (!String.IsNullOrEmpty((string)locacaoDataGridView.Rows[i].Cells[3].Value.ToString()))


mesmo os registro com conteúdo em branco ficam com a linha vermelha?

Teoricamente era para funcionar!

Tente debugar e verificar qual o conteúdo do campo! Se é null ou "" e use a immediate window para fazer os testes.

Ou tente usar a função que lhe passei, pois o DateTime.TryParse valida se a data e datas em branco ou null são invalidas:
#Código
                        DateTime dateResult;
			if (DateTime.TryParse(locacaoDataGridView.Rows[i].Cells[3].Value.ToString(), out dateResult))
			{
				e.CellStyle.ForeColor = Color.Red;
			}


Teria de funcionar.

É o meu primeiro projeto...

Para as todas suas perguntas a resposta é sim.

Usei este método para capturar o valor das células em branco desta coluna 3, e sempre mostra vazio...

#Código
private void button1_Click(object sender, EventArgs e)
        {
            foreach (DataGridViewRow item in locacaoDataGridView.Rows)
            {
                string datadev = item.Cells[3].Value.ToString();

                textBox1.Text = datadev;
            }
        }


E usando este método que passaste, continua ficando tudo Color.Red...

#Código
private void locacaoDataGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            DateTime dateResult;

            for (int i = 0; i < locacaoDataGridView.Rows.Count; i++)

                if (DateTime.TryParse(locacaoDataGridView.Rows[i].Cells[3].Value.ToString(), out dateResult))
                {
                    e.CellStyle.ForeColor = Color.Red;
                }
        }

Jothaz
   - 20 mar 2015

Vamos por partes:

Antes de mais nada tente forçar a ficar preto e só jogar vermelho quando entra no if:

#Código

 
                e.CellStyle.ForeColor = Color.Black;

                if (DateTime.TryParse(locacaoDataGridView.Rows[i].Cells[3].Value.ToString(), out dateResult))
                {
                    e.CellStyle.ForeColor = Color.Red;
                }


Se o erro persistir dê um brakpoint no if dentro do for e faça o teste na immediate windows:

#Código
            DateTime dateResult;
            DateTime.TryParse(locacaoDataGridView.Rows[0].Cells[3].Value.ToString(), out dateResult))
                


e veja o resultado.

Jair Souza
   - 21 mar 2015

A sua primeira dica não mudou nada.

A segunda não pude ir além disto, pois ainda não sei usar immediate windows :

Clique na imagem para abrir em uma nova janela