2009-06-22 23 views
8

Lorsque vous ajoutez un contrôle DateTimePicker, vous pouvez sélectionner une partie de la valeur du contrôle (par exemple le mois), puis utiliser les flèches haut/bas pour modifier cette partie de la date/valeur de temps (par exemple, incrémentation/décrémentation du mois).Comment faire un incrément/décrément DateTimePicker sur la molette de la souris

Ce que je voudrais faire est de permettre la même chose avec la molette de la souris. J'ai essayé de m'inscrire sur l'événement MouseWheel mais je ne trouve pas un moyen de savoir quelle partie de ma date/heure est actuellement sélectionnée, donc je n'ai aucun moyen de savoir si je devrais incrémenter l'heure, le jour, le mois ou le an.

Y at-il un moyen de le faire?

Répondre

11

serait quelque chose comme un possible, mais pas une solution assez élégante:

private void dateTimePicker1_MouseWheel(object sender, System.Windows.Forms.MouseEventArgs e) 
{ 
    if (e.Delta > 0) 
    { 
     System.Windows.Forms.SendKeys.Send("{UP}"); 
    } 
    else 
    { 
     System.Windows.Forms.SendKeys.Send("{DOWN}"); 
    } 
} 

cela devrait certainement fonctionner dans le cas général, mais certains cas de coin peuvent avoir des résultats inattendus (comme avoir des événements KeyUp/KeyDown surchargés)

+0

Merci beaucoup. En fait, j'essayais moi-même quelque chose comme ça, avec un contrôle utilisateur hérité de DateTimePicker, mais je ne savais pas comment envoyer un événement dans le gestionnaire d'événement MouseWheel (essayé this.OnKeyDown, mais n'a obtenu aucun résultat). – Ksempac

+0

Le monde a-t-il été renversé il y a 4 ans ou est-il à l'envers maintenant? J'ai tourné la fonction autour pour obtenir des valeurs plus élevées lors du défilement vers le bas. – Bitterblue

0
dateTimePicker1.MouseWheel += new MouseEventHandler(dateTimePicker1_MouseWheel); 

    private void dateTimePicker1_MouseWheel(object sender, System.Windows.Forms.MouseEventArgs e) 
    { 
     int incrementValue = SystemInformation.MouseWheelScrollLines; 
     //Do increment 
    } 

Référence: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.mousewheel.aspx

+0

Non, vous ne l'avez pas répondu à ma question. Je sais comment obtenir l'incrément (e.Delta est suffisant pour moi). Je sais aussi où est le curseur (e.Location) si j'en ai besoin. Ce que je dois savoir, c'est quelle partie de ma date est actuellement sélectionnée. Par exemple, si ma date est AAAA MM JJ, j'ai besoin de savoir si l'utilisateur a sélectionné MM, DD ou YYYY, afin que je puisse l'incrémenter. Par exemple, dans une zone de texte, vous pouvez obtenir le début et la longueur de la sélection. Ou il y a une fonction qui vous donne l'index le plus proche de la position de votre curseur. Je n'ai rien trouvé de tel pour le DateTimePicker. – Ksempac

+0

Désolé je n'ai pas bu mon café et lire seulement le titre;). – Fiur

0

Si vous définissez la propriété ShowUpDown True vous obtenez une boîte de rotation plutôt qu'une chute vers le bas et ce qui modifie la partie mise en évidence de la date. Bien que je viens de découvrir que ce n'est pas pertinent car les touches fléchées vers le haut et vers le bas modifient la partie en surbrillance de la date, que cette propriété soit définie sur true ou non.

Si vous trouvez ce code, vous devriez aussi pouvoir faire fonctionner la molette de la souris. Je vais jeter un coup d'oeil et voir ce que je peux trouver.

MISE À JOUR:

Je viens de trouver cette note sur la propriété ShowCheckBox:

lecture/écriture. Si la valeur est true, une case à cocher est affichée à gauche de la date-heure valeur dans le contrôle. Lorsque cette case à cocher est cochée, les valeurs du contrôle peuvent être modifiées par l'utilisateur au en mettant en surbrillance une partie de la date et en appuyant sur les touches fléchées. Lorsque cette option n'est pas cochée, la date peut uniquement être modifiée en cliquant sur le menu déroulant pour afficher le calendrier. La valeur par défaut est false.

Est-ce utile?

MISE À JOUR 2:

Je n'ai pas été en mesure de trouver un code qui traite de cet aspect particulier de la DateTimePicker. Microsoft ne publie-t-il plus le code sur ce type de contrôles?

+0

Non, j'ai déjà ShowCheckBox mis à vrai (parce que j'ai besoin de la case à cocher). Donc, comme je l'ai dit, je peux modifier les valeurs avec les flèches haut/bas. Ce que je veux faire maintenant, c'est d'avoir le même comportement avec la molette de la souris (utiliser haut/bas est assez frustrant). Le problème est, je peux trouver un moyen d'obtenir quelle partie de mon contrôle est en surbrillance. – Ksempac

+0

J'utilise .NET depuis deux ans, mais je n'ai jamais vu de code interne de Microsoft. Tout ce que j'ai vu est quelques exemples sur la façon dont ils utilisent l'API qu'ils offrent. Si vous voulez mettre en œuvre votre propre comportement, c'est à vous de déterminer la «magie» que vous devez utiliser. – Ksempac

+0

@Ksempac - retour dans le passé sombre et lointain de Visual C++ et MFC vous avez été capable d'obtenir une partie du code source MFC - un outil inestimable pour aider les choses de travail. MS semble avoir arrêté cette pratique avec C# - à moins que je ne l'ai pas encore trouvé. – ChrisF

0

Je ne suis pas sûr, mais est ce sens tout bon ..

Ne est-il sûr que, coordonnée x pour le mois < x pour le jour < x pour l'année (en supposant pas de format personnalisé) dans le contrôle de datepicker, comme affiché le long de l'axe x incresing

puis peut-être nous pouvons capturer l'événement dateTimePicker1_MouseDown et définir le x coord où nous avons cliqué avant de faire défiler dans une variable dire: différence dans l'endroit où nous avons cliqué et l'emplacement x de la datepicker.

quelque chose comme

Dans dateTimePicker1_MouseDown (expéditeur d'objet, MouseEventArgs e)

{ 
     xCordOfClick = e.X; 
    } 

En cas mousewheel

{ 
     //Do increment based on how far we clicked from the location of the control 
     // increment based on (xCordOfClick - dateTimePicker1.Location.X).ToString()); 
    } 
+0

J'utilise un format personnalisé, mais ce n'est pas un problème, puisque c'est moi qui le règle. J'ai pensé à quelque chose comme ça, mais je voudrais l'éviter, car cela dépend d'une hypothèse comme la taille de la police ou le format utilisé pour déterminer jusqu'où nous sommes dans le contrôle. – Ksempac

+0

Je suis d'accord, c'est une façon brute de le faire, plus comme le monde de la mise au rebut de l'écran :) .. belle question si –

2

J'ai essayé de comprendre cela aussi. En fin de compte, je me suis retrouvé avec ceci:

Private Sub dtpDateTimePicker_MouseWheel(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) 
    If e.Delta > 0 Then 
     SendKeys.Send("{Up}") 
    Else 
     SendKeys.Send("{Down}") 
    End If 
End Sub 

Vous pouvez ajouter automatiquement ce gestionnaire à tous date ramasseurs dans votre formulaire et les conteneurs à l'aide de cette méthode. Il suffit de l'appeler une fois dans form_load:

Public Sub AttachDateTimeMouseWheels(ByRef ownerForm As Control) 

    Dim myControl As Control   

    For Each myControl In ownerForm.Controls 

     If TypeOf myControl Is DateTimePicker Then 
      AddHandler myControl.MouseWheel, AddressOf dtpDateTimePicker_MouseWheel 
     Else 
      If myControl.Controls.Count > 0 Then 
       AttachDateTimeMouseWheels(myControl) 
      End If 
     End If 

    Next 

End Sub 
1

Utilisez sendmessage WM_KEYDOWN/WM_KEYUP

Private Sub DateTimePickerAlarm_MouseWheel(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles DateTimePickerAlarm.MouseWheel 
     If e.Delta > 0 Then 
      Native.User32.SendMessage(DateTimePickerAlarm.Handle, &H100, Keys.Up, &H1480001) 
      Native.User32.SendMessage(DateTimePickerAlarm.Handle, &H101, Keys.Up, &HC1480001) 
     Else 
      Native.User32.SendMessage(DateTimePickerAlarm.Handle, &H100, Keys.Down, &H1500001) 
      Native.User32.SendMessage(DateTimePickerAlarm.Handle, &H101, Keys.Down, &HC1500001) 
     End If 
     'msg=0x100 (WM_KEYDOWN) hwnd=0x???????? wparam=0x26 lparam=0x01480001 result=0x0 
     'msg=0x101 (WM_KEYUP) hwnd=0x???????? wparam=0x26 lparam=0xc1480001 result=0x0 
     'msg=0x100 (WM_KEYDOWN) hwnd=0x???????? wparam=0x28 lparam=0x01500001 result=0x0 
     'msg=0x101 (WM_KEYUP) hwnd=0x???????? wparam=0x28 lparam=0xc1500001 result=0x0 
    End Sub 
Questions connexes