2012-11-16 3 views
-1

salut iam création d'un formulaire de réservation d'hôtel et voulait calculer le coût total du séjour par les nuits passées. il nécessite une date d'arrivée et une date de départ, mais je souhaite ajouter une validation, donc si l'utilisateur saisit un format incorrect, une boîte de message s'affiche pour lui demander d'essayer à nouveau. Voici mon code a déjà eu un peu d'aide avec la conversion de la durée donc une fois de plus toute aide serait incroyable. l'erreur est sur la ligne qui commence « = DATEDIFF laDate » et il dit les variables ADate et dDate sont grâce à l'avance: non affectésdate validation réservation hôtel

 String arrival, departure; 
     arrival = textBox1.Text; 
     departure = textBox2.Text; 

     DateTime aDate, dDate; 

     try 
     { 
      aDate = DateTime.ParseExact(arrival, "dd/mm/yyyy", null); 
      dDate = DateTime.ParseExact(departure, "dd/mm/yyyy", null); 
      return; 
     } 
     catch 
     { 
      MessageBox.Show("Invalid input format please enter in format DD/MM/YYYY"); 
     } 

     TimeSpan dateDiff; 
     dateDiff = dDate.Subtract(aDate); 
     int nights = (int)dateDiff.TotalDays; 

     textBox3.Text = ("" + nights); 
     textBox5.Text = ("£" + (nights * 115)); 

Répondre

0

Utilisez le contrôle DateTimePicker vous n'avez pas besoin de Parse

1

Votre code qu'il continue après vos prises. Placez le code en utilisant les dates dans votre try-block.

 String arrival, departure; 
     arrival = textBox1.Text; 
     departure = textBox2.Text; 

     DateTime aDate, dDate; 

     try 
     { 
      aDate = DateTime.ParseExact(arrival, "dd/mm/yyyy", null); 
      dDate = DateTime.ParseExact(departure, "dd/mm/yyyy", null); 

      TimeSpan dateDiff; 
      dateDiff = dDate.Subtract(aDate); 
      int nights = (int)dateDiff.TotalDays; 

      textBox3.Text = ("" + nights); 
      textBox5.Text = ("£" + (nights * 115)); 
     } 
     catch 
     { 
      MessageBox.Show("Invalid input format please enter in format DD/MM/YYYY"); 
     } 

Et ne pas revenir si elles analyser correctement, ou vous aurez aucun résultat lorsque votre entrée ne validate.

Alternativement, placez le retour dans votre catch-block, de sorte que l'exécution est arrêtée en cas d'échec.

+0

compagnon qui est sur place! merci beaucoup tous triés – user1823383

+0

acclamations René tous triés! votre étoile – user1823383

0

Affectez des valeurs par défaut à votre aDate, dDate et l'erreur disparaîtra. La raison en est que le compilateur ne peut pas déterminer si des valeurs seront assignées avec certitude dans le bloc try. Vous pouvez faire

DateTime aDate = default(DateTime); 
DateTime dDate = default(DateTime); 

MAIS

au lieu d'utiliser try-catch pour valider la date, son meilleur si vous utilisez DateTime.TryParseExact

DateTime aDate, dDate; 


if (DateTime.TryParseExact(arrival, 
          "dd/MM/yyyy", 
          CultureInfo.InvariantCulture, 
          DateTimeStyles.NoCurrentDateDefault, 
          out aDate)) 
{ 
    MessageBox.Show("Invalid input format please enter in format DD/MM/YYYY"); 
} 

donc votre code complet devrait être:

String arrival, departure; 
arrival = textBox1.Text; 
departure = textBox2.Text; 

DateTime aDate, dDate; 


if (DateTime.TryParseExact(arrival, 
          "dd/MM/yyyy", 
          CultureInfo.InvariantCulture, 
          DateTimeStyles.NoCurrentDateDefault, 
          out aDate)) 
{ 
    MessageBox.Show("Invalid input format for Arrival Date - please enter in format DD/MM/YYYY"); 
} 
if (DateTime.TryParseExact(departure, 
          "dd/MM/yyyy", 
          CultureInfo.InvariantCulture, 
          DateTimeStyles.NoCurrentDateDefault, 
          out dDate)) 
{ 
    MessageBox.Show("Invalid input format for Departure Date - please enter in format DD/MM/YYYY"); 
} 


TimeSpan dateDiff; 
dateDiff = dDate.Subtract(aDate); 
int nights = (int)dateDiff.TotalDays; 

textBox3.Text = ("" + nights); 
textBox5.Text = ("£" + (nights * 115)); 
+0

merci d'être revenu je lisais sur cela plus tôt mais est allé avec essayer et attraper car c'est quelque chose de plus familier avec (très nouveau à ceci) mais cherchant vraiment à rendre mon codage aussi efficace comme possible si malade essaye de commencer à l'intégrer dans le futur – user1823383

+0

@ user1823383, Pour l'analyse des données, je suggère toujours de préférence les méthodes TryParse avec les types de données respectifs, la gestion des exceptions pour la validation peut être très coûteuse et devrait être évitée si possible. – Habib

1

Votre code doit être

String arrival, departure; 
    arrival = textBox1.Text; 
    departure = textBox2.Text; 

    DateTime aDate, dDate; 

    try 
    { 
     aDate = DateTime.ParseExact(arrival, "dd/mm/yyyy", null); 
     dDate = DateTime.ParseExact(departure, "dd/mm/yyyy", null); 

     TimeSpan dateDiff; 
     dateDiff = dDate.Subtract(aDate); 
     int nights = (int)dateDiff.TotalDays; 

     textBox3.Text = ("" + nights); 
     textBox5.Text = ("£" + (nights * 115)); 

    } 
    catch 
    { 
     MessageBox.Show("Invalid input format please enter in format DD/MM/YYYY"); 
     return; 
    } 
+1

Je dois être saoul, je vois le même code deux fois! ;) –

2

La raison de l'avertissement du compilateur est que vous n'avez pas attribué une valeur à vos DateTime locaux champs. Les variables locales ne sont pas initialisées avec une valeur par défaut, vous devez donc le faire manuellement avant de pouvoir les utiliser. Puisque vous attribuez la valeur dans un Try/Catch, il n'est pas garanti qu'ils en obtiendront un.

Au lieu de cela, vous pouvez utiliser DateTime.TryParseExact:

DateTime aDate, dDate; 
if(DateTime.TryParseExact(arrival, "dd/mm/yyyy", null, DateTimeStyles.None, out aDate) 
&& DateTime.TryParseExact(departure, "dd/mm/yyyy", null, DateTimeStyles.None, out dDate)) 
{ 
    // ... 
} 
else{ 
    MessageBox.Show("Invalid input format please enter in format DD/MM/YYYY"); 
} 
+0

merci pour la réponse mate – user1823383

+0

+1 pour expliquer la raison de l'erreur sur les valeurs non attribuées – Habib