Petit exemple en C#.
(Le calendrier est afficher à des fins de contrôle uniquement)
Code :
private void Date_ValueChanged(object sender, EventArgs e) { // Récupération de la culture actuelle System.Globalization.CultureInfo ci = System.Threading.Thread.CurrentThread.CurrentUICulture; // Déjà, on crée une date avec un jour approximativement proche // de la date choisie : // Règle bidon donc : année = celle choisie, et jour de l'année environ (semaine choisie -1) * 7 DateTime date = new DateTime ( (int)numericUpDown2.Value, (int)Math.Max(1, (numericUpDown1.Value - 1 * 7) / 30), (int)Math.Max(1, (numericUpDown1.Value - 1 * 7) % 30) ); // Maintenant, la partie crade... On ajoute un jour jusqu'à ce qu'on ait la bonne semaine while (ci.Calendar.GetWeekOfYear(date, ci.DateTimeFormat.CalendarWeekRule, ci.DateTimeFormat.FirstDayOfWeek) < numericUpDown1.Value) { date = date.AddDays(1); } monthCalendar1.SetDate(date); label1.Text = date.ToLongDateString(); label2.Text = date.AddDays(6).ToLongDateString(); }
|
Ce code est lancé lorsque je change la valeur d'une des deux listes numériques. La première correspond au numéro de semaine, et la seconde à l'année.
Attention, les règles des semaines sont spécifiques à la culture du poste client, attention donc à passer les paramètres correctement (ici, je reprend la locale utilisé par le programme, ce qui n'est pas aussi simple à faire en VB6).
L'algo n'est pas parfait, car pour la première semaine de l'année, au lieu de commencer au lundi, il commence au 1° janvier. Il faut donc ajouter une verrue pour gérer ce cas spécifique.
Message édité par MagicBuzz le 15-01-2008 à 12:03:33