none
Comando if RRS feed

  • Pergunta

  • Bom dia

    Preciso inserir um comando if no evento "Enter" de um campo. Abaixo deixo a explicação

    Tenho um campo formatado para hora, porém no banco ele está cadastrado como string

    O que preciso é que ao ir para o próximo campo ele verifique se as horas estão dentro das 24:00

    O código seria mais ou menos assim imagino, mas não funcionou.

    If mtxtHoras_Jejum.Text <"00:00" or > "23:59" then

    Message.Show("Hora inválida, digitar de novo")

    mtxt.Horas_Jejum.Focus

     

    Aguardo sugestões

    quarta-feira, 17 de novembro de 2010 13:14

Respostas

  • Olá eu testei este código e ele funcionou normalmente,

    As vezes o erro está acontecendo devido a alguma configuração regional da máquina com relação a formatação de Data, o que pode ser verificado.

     De qualquer forma estou enviando um outro código que não usa o ToShortDateString para tentar evitar problemas como configurações regionais:

    try
    {
      string Horas_Jejum = mtxtHoras_Jejum.Text;
      string Data_Atual = DateTime.Now.ToString("dd/MM/yyyy");
      DateTime Data_Validar = DateTime.Parse(Data_Atual + " " + Horas_Jejum);        
    }
    catch (FormatException ex)
    {
      MessageBox.Show("Hora invalida").
      mtxtHoras_Jejum.Focus();
    }  
    

    Repare que ao concatenar a dataatual com a hora eu insiro um espaço em branco (Data_Atual + "  " + Horas_Jejum) para que o .net possa interpretar o código da seguinte forma:

    17/11/2010     12:00

    Atenciosamente


    Se o post foi útil marque como resposta. - Advanced Web Application - MCP - Twitter: @mpghelli
    • Marcado como Resposta Psmerlo quinta-feira, 18 de novembro de 2010 11:32
    quarta-feira, 17 de novembro de 2010 20:05

Todas as Respostas

  • É porque a estrutura foi montada errada.

    Tente seguir essa estrutura:

    if (mtxtHoras_Jejum.Text == "00:00" || mtxtHoras_Jejum.Text == "23:59")

    {

    Bloco caso seja verdadeiro

    }

    Else

    {

    Bloco casos seja falso

    }

     

    De uma olhada também em:

    http://msdn.microsoft.com/en-us/library/5011f09h%28VS.71%29.aspx

    quarta-feira, 17 de novembro de 2010 13:42
  • Olá,

    O seu código não funciona pois o .NET não consegue comparar se um valor string é maior ou menor que o outro, mesmo que internamente esta string contenha um número ou como acontece no seu caso uma hora.

     

    Para fazer esta comparação você pode fazer a conversão da sua hora para um tipo datetime, usando a Data Atual do sistema por exemplo para conseguir obter um tipo datetime, se a hora informada for uma hora inválida o .NET irá disparar uma exceção, veja o código em C#:

     

    try
          {
            string horaAValidar = mtxtHora_Jejum.Text;
            string dataAtual = DateTime.Now.ToShortDateString();
            DateTime dataHoraAValidar = DateTime.Parse(dataAtual + " " + horaAValidar);        
            Console.WriteLine("Hora está dentro das 24");
          }
          catch(FormatException)
          {
            Console.WriteLine("Hora está fora das 24");
          }  
    

     

    Repare no código acima que eu conteno a data atual (DateTime.Now.ToShortDateString()) juntamente com o campo onde é informado as horas  (mtxtHoras_Jejum.Text), tento converter esta junção em um tipo DateTime se nenhuma exceção for disparada este valor esta válido, caso contrário se uma exceção do tipo FormatException for disparada quer dizer que o valor da hora está inválido.

    O exemplo acima foi testada em uma Console Application, por isto você deve substituir o comando Console.WriteLine pelo comando que exibe a mensagem desejada, exemplo: MessageBox.Show

    Atenciosamente

     

     


    Se o post foi útil marque como resposta. - Advanced Web Application - MCP - Twitter: @mpghelli
    • Sugerido como Resposta Pablo Barbosa quarta-feira, 17 de novembro de 2010 15:44
    quarta-feira, 17 de novembro de 2010 14:42
  • Estou tentando fazer com o código sugerido pelo Guilherme

    Vamos ver se funciona

    • Editado Psmerlo quarta-feira, 17 de novembro de 2010 16:31
    quarta-feira, 17 de novembro de 2010 16:20
  • Olá,

     

    O código está completo, bastando você inclui-lo no evento onde deseja realizar a validação, qual é sua dúvida?

     


    Se o post foi útil marque como resposta. - Advanced Web Application - MCP - Twitter: @mpghelli
    quarta-feira, 17 de novembro de 2010 16:22
  • Fiz da seguinte forma, mas ele fica caindo direto na mensagem, indiferente se digito 12:00 ou 25:00

    Abaixo o código

    try
       {
        string Horas_Jejum = mtxtHora_Jejum.Text;
        string Data_Atual = DateTime.Now.ToShortDateString();
        DateTime Data_Validar = DateTime.Parse(Data_Atual + " " + Horas_Jejum);    
    
        Horas_Jejum = mtxtHoras_Jejum.Text;
       }
       catch(Exception ex)
       {
        MessageBox.Show("Hora invalida").
    mtxtHoras_Jejum.Focus();
    
       } 
    

    quarta-feira, 17 de novembro de 2010 16:58
  • Olá eu testei este código e ele funcionou normalmente,

    As vezes o erro está acontecendo devido a alguma configuração regional da máquina com relação a formatação de Data, o que pode ser verificado.

     De qualquer forma estou enviando um outro código que não usa o ToShortDateString para tentar evitar problemas como configurações regionais:

    try
    {
      string Horas_Jejum = mtxtHoras_Jejum.Text;
      string Data_Atual = DateTime.Now.ToString("dd/MM/yyyy");
      DateTime Data_Validar = DateTime.Parse(Data_Atual + " " + Horas_Jejum);        
    }
    catch (FormatException ex)
    {
      MessageBox.Show("Hora invalida").
      mtxtHoras_Jejum.Focus();
    }  
    

    Repare que ao concatenar a dataatual com a hora eu insiro um espaço em branco (Data_Atual + "  " + Horas_Jejum) para que o .net possa interpretar o código da seguinte forma:

    17/11/2010     12:00

    Atenciosamente


    Se o post foi útil marque como resposta. - Advanced Web Application - MCP - Twitter: @mpghelli
    • Marcado como Resposta Psmerlo quinta-feira, 18 de novembro de 2010 11:32
    quarta-feira, 17 de novembro de 2010 20:05
  • Olá Sr. Psmerlo bom uma dica interessante para o teu caso sem desmerecer ninguem mas vc não precisaria disparar uma exceçõa para isso seria em ultimo caso msmo mas vou lhe apresentar o método TryParse, ele está presente na maioria das structs e é de boa utilidade, descobri o mesmo a um tempo atrás e creio q ele caiba perfeitamente para tua e muitas outras situações.

    Bom explicando o funcionamento este método recebe dois argumentos uma string q é o valor a ser convertido e um objeto do tipo a ser convertido sendo passado como out ou seja o framework vai mudar o valor da referencia dele em memória e não só a cópia de um parametro e com isto o valor ira persistir para uso no restante do programa, e o bom deste método é q ele nos tras duas coisas primeiro ele retorna um BOOL ou seja se o valor pode ser convertido, ele retorna TRUE,
    se não ele retorna FALSE e não necessáriamente uma Exception ^^ e o bom é q se se ele retornar TRUE ele automaticamente já converte o valor de teu objeto passado como parametro OUT, mas na prática ficaria assim:

     

    public void TeuMetodo(string horas)
    {  
       DateTime dt;
       if(!DateTime.TryParse(horas, out dt))
        MessageBox.Show("Forneça um horário válido");
       else
       {
        //Faça o q vc quiser nesta área 
    //lembrando que aqui voce pode usar nossa variavel DateTime dt
    //pois se o Método TryParse retornar TRUE ele vai converter automáticamente o valor fornecido em uma data
    //e irá atribuir este valor a variavel passada como OUT ^^

    } }
    Básicamente é isso ae galerinha e por favor se for útil não esqueça de marcar isso ajudará outros membros do fórum com a mesma dúvida encontrarem mais fácil
    uma boa solução ^^

    Att Edney
    Desenvolvedor C# Windows Forms, Asp.Net WebForms, Asp.Net MVC
    quarta-feira, 17 de novembro de 2010 23:45
  • Bom dia

    Não sei o que podeestar ocorrendo, mas não está dando certo. O que ocorre é que insiro um valor no textbox 1200 (formatad com mask fica 12:00) porém qdo vou par ao próximo campo ele fica aparecendo como hora inválida e hora inválida seria somente antes de 00:00 e após as 23:59

     

    Fiz o seu código exatamente como me enviou, mas fica caindo na mensagem de hora inválida

     

    quinta-feira, 18 de novembro de 2010 10:19
  • olá meu caro eu testei aki e funcionou perfeitamente o código,veja se o valor q ta indo pro método ta indo com a mascara corretamente isso pode estar interfirindo e outra se  me permite até agora não intendi o pq da lógik < 00:00 e > 23:59 o q cairia numa condição dessas seria um intervalo de 23:59:01 até 23:59:59, bom qlqr coisa pra vc tirar a duvida e ver o funcionamento posta um email ae q eu te mando o código zipado pra ti ver q ta funfando ok

    qlqr coisa posta ae


    Att Edney Desenvolvedor C#, WindowsForms, Asp.Net WebForms, Asp.Net MVC
    quinta-feira, 18 de novembro de 2010 11:15
  • Desculpa o erro foi meu, pq estava excluindo os formatos na hora de gravar

    Funcionou certinho

     

    quinta-feira, 18 de novembro de 2010 11:33
  • ^^ qlqr duvida posta ae sóah não se esqueça de marcar as respostas corretas isto ajuda outros participantes com a mesma dúvida encontrarem solução mais rápidamente
    Att Edney Desenvolvedor C#, WindowsForms, Asp.Net WebForms, Asp.Net MVC
    quinta-feira, 18 de novembro de 2010 11:44
  • Blz, só que agora surgiu outro problema

    Deposi que fiz os códigos, o meu form qdo carrega não está mais carregando a tabela como antes e o meu relatório não está gerando os dados

    Antes de fazer o código funcionva certinho, o que pode ser?

     

    quinta-feira, 18 de novembro de 2010 12:28
  • Olá,

    O código de carga dos dados está dentro do Try onde você está tratando a hora?
    Se estiver dentro do try após a conversão da data para validação da hora ele só irá carregar os dados se a hora inserida for válida,então, se for este caso você deve colocar o código de carga dos dados antes do try, ou antes do código que valida
    a hora.

    Além da solução já apresentada, que pode pode SIM ser usada visto que é um recurso nativo do C# que permite tratar diversos tipos de exções diferentes, Você também poderia usar o Try.Parse como falou nosso amigo ai em cima: 

     string Horas_Jejum = mtxtHoras_Jejum.Text;
     string Data_Atual = DateTime.Now.ToString("dd/MM/yyyy");
     DateTime dt;
     if(!DateTime.TryParse(Data_Atual + " " + Horas_Jejum, out dt))
     MessageBox.Show("Forneça um horário válido");
     else
     {
     //Seu código
     }
    
    

     Ou, sem desmerecer ninguém, você também pode usar expressões regulares para validar somente a hora, veja:

    //Importar a biblioteca de expressões regulares em .NET no topo do código
    using System.Text.RegularExpressions;
    
    //Criar metodo de validação da hora
     public static bool ValidaHora(string hora)
      {
    
       Regex r = new Regex(@"([0-1][0-9]|2[0-3]):[0-5][0-9]");
       Match m = r.Match(hora);
       return m.Success;
      }
    
    //Chamar o metodo de validação da hora
    string hora = mtxtHoras_Jejum.Text;
       if (!ValidaHora(hora))
       {
         MessageBox.Show("Hora invalida").
     mtxtHoras_Jejum.Focus();
       }
    
    

    Para este último exemplo a única observação é que você tem de limitar o número de caracteres no campo texto(MaxLenght)que irá receber a hora a um número máximo de 5 caracteres (00:00)

    O importante é que independente da forma como você fizer a validação, o código de carga dos dados não será afetado a não ser que ele seja inserido dentro do código de validação da hora ou dependa do resultado destas funções de validação para sua execução.

    Atenciosamente


     


    Se o post foi útil marque como resposta. - Advanced Web Application - MCP - Twitter: @mpghelli
    quinta-feira, 18 de novembro de 2010 14:17