none
Comportement étrange pour un DateTimePicker RRS feed

  • Question

  • Salut à tous.

     

    J'ai une petite application qui fait un traitement assez lourd pour une date donnée.

    L'utilisateur spécifie une date via un DateTimePicker.

    J'utilise l'événement Change du DateTimePicker pour lancer le traitement lourd en question dès qu'on a choisi une date.

    Avant de lancer ce traitement lourd, j'affiche une fenêtre d'attente.

    Je suis obligé de faire un Application.DoEvents() avant mon traitement lourd sinon Windows ne met à jour l'affichage et ma fenêtre d'attente n'est complètement visible qu'après la fin de mon traitement lourd.

    Vous me suivez ?

     

    Voici mon code, plus simple que mon explication textuelle:

     

    Private Sub date_time_picker_ValueChanged(...) Handles date_time_picker.ValueChanged

    Dim n As Form

    n = New fenêtre_attente

    n.Visible = True

    Application.DoEvents()

    REM début traitement lourd...

    REM fin traitement lourd...

    End Sub

     

    Maintenant, lancez l'application, ouvrez le DateTimePicker pour choisir un jour du mois dans le calendrier et utilisez une des flèches pour changer de mois: l'application boucle comme si on changeait de mois en permenance !

     

    Avez-vous une solution ?

     

    Merci d'avance,

    Alain.

     

    mercredi 4 juin 2008 12:29

Réponses

  • Bonjour Alain,

     

    Malheureusement, ce que vous voulez faire avec le DatetimePicker et plus particulièrement en utilisant cet évènement n'est pas possible. Pour faire simple dans les explications :

    Lorsque vous appuyez sur le bouton qui sert à changer de mois il se passe plusieurs choses :

    D'une part la valeur du DatetimePicker change et de ce fait ValuedChanged est déclenché

    Mais un message windows est transmis compte tenu du fait que vous avez appuyer sur le bouton qui sert à faire défiler les mois. Ce message est stocké dans la file d'attente et DoEvent se charge de traiter cet évènement. Du coup le chat se mort la queue.

    Pourquoi cela ne fait pas cela lorsque l'on clique sur un jour ? Si vous cliquez sur un jour et que vous laissez appuyer, il ne se passe rien. En revanche si vous laissez appuyer sur le bouton qui sert à faire défiler les mois cela aura l'effet attendu, les mois défilerons. C'est la le coeur du problème ! Lorsque nous avons le message "j'ai appuyé sur le bouton" ce dernier est traité pour DoEvent avant même qu'il y ait le message "J'ai laché le bouton"

     

    Pour réaliser ce que vous souhaitez je réitère les préconisations de Biche sinon, il ne vous reste plus qu'à utiliser MontCalendar et utiliser l'évènement DateSelected.

     

    Amicalement,

     

    Mathieu

     

     

    vendredi 6 juin 2008 14:01
  • Merci pour votre réponse professionnelle.

    J'ai trouvé un workaround.

    C'est un peu moins bien mais tant pas: je n'affcihe plus le calendrier mais j'affiche simplement les UpDown arrow, à droite de la date.

     

    Encore merci à tous pour votre aide.

     

    Alain.

     

    mercredi 11 juin 2008 07:20

Toutes les réponses

  • Pour alléger ton application et éviter de faire des DoEvents, utilise le contrôle BackgroundWorker, il va te permettre de lancer ton traitement lourd de facon asynchrone dans un autre thread, sans affecter les performances de ton appli.
    mercredi 4 juin 2008 14:41
    Modérateur
  • Oui, on m'a déjà parlé du BackgroundWorker avant que j'utilise le DoEvents mais cette première solution est trop compliquée à mettre en oeuvre pour moi... du moins pour le moment.

    Que l'utilisateur attende un peu n'est pas un problème; le DoEvents a donc ma préférence.

     

    Reste le problème qui apparaît avec mon dateTimePicker...

    Avez-vous pu reproduire le problème ?

     

    Bonne journée,

    Alain de Belgique.

     

    jeudi 5 juin 2008 05:34
  • En parcourant le web, plusieurs sites donne comme correction à ce problème d'utiliser l'évènement Validating au lieu du ValueChanged, es-ce que tu peux essayé?
    jeudi 5 juin 2008 12:10
    Modérateur
  • L'événement Validating ne se déclenche que lorsque l'utilisateur quitte le DateTimePicker ce qui ne me convient pas.

    Dès que la valeur du DateTimePicker change, il faut exécuter le traitement lours en question...

     

    A bientôt,

    Alain.

     

    vendredi 6 juin 2008 07:30
  • Bonjour Alain,

     

    Malheureusement, ce que vous voulez faire avec le DatetimePicker et plus particulièrement en utilisant cet évènement n'est pas possible. Pour faire simple dans les explications :

    Lorsque vous appuyez sur le bouton qui sert à changer de mois il se passe plusieurs choses :

    D'une part la valeur du DatetimePicker change et de ce fait ValuedChanged est déclenché

    Mais un message windows est transmis compte tenu du fait que vous avez appuyer sur le bouton qui sert à faire défiler les mois. Ce message est stocké dans la file d'attente et DoEvent se charge de traiter cet évènement. Du coup le chat se mort la queue.

    Pourquoi cela ne fait pas cela lorsque l'on clique sur un jour ? Si vous cliquez sur un jour et que vous laissez appuyer, il ne se passe rien. En revanche si vous laissez appuyer sur le bouton qui sert à faire défiler les mois cela aura l'effet attendu, les mois défilerons. C'est la le coeur du problème ! Lorsque nous avons le message "j'ai appuyé sur le bouton" ce dernier est traité pour DoEvent avant même qu'il y ait le message "J'ai laché le bouton"

     

    Pour réaliser ce que vous souhaitez je réitère les préconisations de Biche sinon, il ne vous reste plus qu'à utiliser MontCalendar et utiliser l'évènement DateSelected.

     

    Amicalement,

     

    Mathieu

     

     

    vendredi 6 juin 2008 14:01
  • Merci pour votre réponse professionnelle.

    J'ai trouvé un workaround.

    C'est un peu moins bien mais tant pas: je n'affcihe plus le calendrier mais j'affiche simplement les UpDown arrow, à droite de la date.

     

    Encore merci à tous pour votre aide.

     

    Alain.

     

    mercredi 11 juin 2008 07:20