2017-06-16 5 views
1

Lorsque l'outil datetimepicker est utilisé, il arrive que l'utilisateur n'effectue aucune modification et ferme le datetimepicker. Après la fermeture du datetimepicker, mon programme vérifie si la date convient au reste des données. Je veux empêcher cette vérification si datetimepicker est fermé par échappement ou en cliquant ailleurs.Vérification de la touche enfoncée lors de la fermeture de datetimepicker

Est-il possible de détecter si datetimepicker est fermé sans avoir choisi de date? J'utilise close-up et EventArgs.

+0

Utilisation une variable 'bool'. Définissez-le sur * true * lorsque vous obtenez l'événement ValueChanged. –

+0

@HansPassant Que pensez-vous de [my] (https://stackoverflow.com/a/44594904/5687778) approche? Ce ne serait pas mieux? – Deadzone

+0

@Dead - La validation sera déclenchée même si l'utilisateur n'a pas choisi de valeur. –

Répondre

1

Je pense que le problème ici est que l'événement se déclenche valueChanged même lorsque l'utilisateur est simplement la navigation sur le calendrier. Je ne vois pas une façon vraiment évidente de le gérer. Cependant le code suivant fera un travail décent d'ignorer les événements de changements de valeur entre les événements DropDown et CloseUp.

bool UserIsJustLooking = false; 

    private void dateTimePicker1_DropDown(object sender, EventArgs e) 
    { 
     UserIsJustLooking = true; 
     dateTimePicker1.Tag = dateTimePicker1.Value; 
    } 

    private void dateTimePicker1_ValueChanged(object sender, EventArgs e) 
    { 
     if (UserIsJustLooking) 
     { 
      // the user is just browsing the dates (ignore these value changed events because they aren't real) 
     } 
     else 
     { 
      Console.WriteLine("The value changed without opening, new value is " + dateTimePicker1.Value.ToString()); 
     } 

    } 

    private void dateTimePicker1_CloseUp(object sender, EventArgs e) 
    { 
     UserIsJustLooking = false; 
     if ((DateTime)dateTimePicker1.Tag == dateTimePicker1.Value) 
     { 
      // User did not really change the value 
     } 
     else 
     { 
      Console.WriteLine("User selected a new value: " + dateTimePicker1.Value); 
     } 
    } 
+0

J'utilise la propriété close-up pas ValueChanged parce que j'ai beaucoup de mal avec ValueChanged Je ne sais pas pourquoi? –

+0

Le problème principal avec ValueChanged est que il change lorsque l'utilisateur fait décaler le DateTimePicker et que l'utilisateur clique sur lui (ou déplace le mois du calendrier à la fois), ce qui produit des effets indésirables si vous souhaitez modifier en temps réel d'autres contrôles du formulaire. ignorer l'événement ValueChanged lorsque le contrôle est 'ouvert' ... c'est ce que fait ce code – David

+0

J'ai utilisé la propriété close-up, ça me va, merci beaucoup pour la réponse –

0

Vous pouvez utiliser les méthodes de validation intégrées:

private void DateTimePicker_Validating(object sender, CancelEventArgs e) 
{ 
    //validation logic 

    //if valid 
    e.Cancel = false; 

    //else 
    e.Cancel = true;    
} 

Réglage de la CancelEventArgs.Cancel true empêchera le contrôle de perdre le focus.

Vous devez le joindre à votre DateTimePicker événement Validation

0

Après l'illumination de David que je ne pouvais pas résoudre le problème avec

if ((DateTime)dateTimePicker1.Tag == dateTimePicker1.Value) 

J'ai créé une autre version.

En classe partielle public, j'ajouté ces

public bool EscPressed = false; 
public string calTag = DateTime.Now.ToString("d"); 

J'ai écrit cette méthode

private void cal_Close(object sender, EventArgs e) 

{  
    EscPressed = false; 
    if (calTag == cal.Value.ToString("d")) 
      EscPressed = true; 
    else 
      EscPressed = false; 
    cal.Visible = false; 
    if (EscPressed) 
     return; 
    calTag = cal.Value.ToString("d"); 
    _textBox[1].Text = _textBox1[1].Text = calTag; 
    CheckDate(); 
} 

PS: checkdate() est une méthode qui vérifie si la date est bien choisie ou non