2010-09-20 4 views
2

Merci les gars de m'avoir aidé à résoudre les problèmes à 1 chiffre et> 31.Crash du programme C#

Maintenant, une dernière chose ... si une zone de texte a des caractères non-numériques ou aucun caractère, le programme va planter.

est ici tout le code:

private void generate_Click(object sender, EventArgs e) 
     { 
      int val = 0; 

      if (Int32.TryParse(dd.Text, out val)) 
      { 
       if (val > 31) return; 
       else if (dd.Text.Length <= 1) 
        return; 
      } 

      if (Int32.TryParse(MM.Text, out val)) 
      { 
       if (val > 31) return; 
       else if (MM.Text.Length <= 1) 
        return; 
      } 

      if (Int32.TryParse(hh.Text, out val)) 
      { 
       if (val > 31) return; 
       else if (hh.Text.Length <= 1) 
        return; 
      } 

      if (Int32.TryParse(M.Text, out val)) 
      { 
       if (val > 31) return; 
       else if (M.Text.Length <= 1) 
        return; 
      } 

      if (Int32.TryParse(ss.Text, out val)) 
      { 
       if (val > 31) return; 
       else if (ss.Text.Length <= 1) 
        return; 
      } 

      String dateString = yyyy.Text + dd.Text + MM.Text + hh.Text + M.Text + ss.Text; 
      DateTime timestamp = DateTime.ParseExact(dateString, "yyyyddMMhhmmss", CultureInfo.CurrentCulture); 
      long ticks = timestamp.Ticks; 
      long microseconds = ticks/10; 
      convertedText.Text = microseconds.ToString("X"); 
     } 

Que dois-je faire? Je sais que c'est un peu brouillon ... mais ça marche et c'est ma première application C#: P Merci encore!

+1

Je me demandais: 'convertedText' contient le nombre de microsecondes écoulées depuis 12:00:00 minuit, le 1er Janvier, 0001 Est-ce vraiment ce que vous cherchez? –

+0

Oui, c'est vrai :) – Mark

Répondre

2

Pour commencer, enveloppez votre code dans un bloc try catch. Cela empêchera l'exception de planter automatiquement le programme. Vous pouvez attraper l'exception et informer l'utilisateur qu'il y a un problème avec l'entrée.

Ensuite, vous pouvez faire quelque chose comme:

catch 
{ 
    MessageBox.Show("Please enter numbers only."); 
} 

vraiment dans une application de production, vous voulez faire un peu plus comme attraper un type d'erreur spécifique. Mais pour commencer, ça ira très bien.

+0

est la façon dont je le ferais. J'adore essayer de rattraper les boucles – Spooks

0

Est-ce que cela résoudra votre problème particulier? vous faites TryParsing et ensuite validez l'entier avec plus de 31 ou moins de 1 mais ne pas gérer si TryParse échoue.

private void generate_Click(object sender, EventArgs e) 
     { 
      int val = 0; 

      if (Int32.TryParse(dd.Text, out val)) 
      { 
       if (val > 31) return; 
       else if (dd.Text.Length <= 1) 
        return; 
      } 
      else 
      { 
       return; 
      } 

      if (Int32.TryParse(MM.Text, out val)) 
      { 
       if (val > 31) return; 
       else if (MM.Text.Length <= 1) 
        return; 
      } 
      else 
      { 
       return; 
      } 

      if (Int32.TryParse(hh.Text, out val)) 
      { 
       if (val > 31) return; 
       else if (hh.Text.Length <= 1) 
        return; 
      } 
      else 
      { 
       return; 
      } 

      if (Int32.TryParse(M.Text, out val)) 
      { 
       if (val > 31) return; 
       else if (M.Text.Length <= 1) 
        return; 
      } 
      else 
      { 
       return; 
      } 

      if (Int32.TryParse(ss.Text, out val)) 
      { 
       if (val > 31) return; 
       else if (ss.Text.Length <= 1) 
        return; 
      } 
      else 
      { 
       return; 
      } 

      String dateString = yyyy.Text + dd.Text + MM.Text + hh.Text + M.Text + ss.Text; 
      DateTime timestamp = DateTime.ParseExact(dateString, "yyyyddMMhhmmss", CultureInfo.CurrentCulture); 
      long ticks = timestamp.Ticks; 
      long microseconds = ticks/10; 
      convertedText.Text = microseconds.ToString("X"); 
     } 
0

Il plantait sur ParseExact si dateString est pas dans le bon format.
Utilisez plutôt TryParseExact.

5

Si vous allez juste revenir si la date n'a pas parse, vous pouvez ignorer tout le code de validation et il suffit d'utiliser TryParseExact:

private void generate_Click(object sender, EventArgs e) 
{ 
    String dateString = yyyy.Text + dd.Text + MM.Text + hh.Text + M.Text + ss.Text; 
    DateTime timestamp 
    if (!DateTime.TryParseExact(dateString, "yyyyddMMhhmmss", null, 
             DateTimeStyles.None, out timestamp)) 
     return;         
    long ticks = timestamp.Ticks; 
    long microseconds = ticks/10; 
    convertedText.Text = microseconds.ToString("X"); 
} 
0

Je suppose son votre ParseExact écraser cette ... Mais je ne suis pas tout à fait sûr ... Envelopper tout dans un essai attraper ou plusieurs essayer des captures. Ensuite, vous pouvez voir ce qui se passe et corriger ...

Quelque chose comme:

try{ 
//Parse something... 

}catch(Exception ex) 
{ 
    throw ex; //I usually put a break point here when I'm debugging... 
}