2009-06-22 14 views
8

Wenn Sie ein Datetimepicker-Steuerelement hinzufügen, können Sie einen Teil des Steuerwerts (zum Beispiel des Monat) und verwenden Sie die Aufwärts-/Abwärtspfeile wählen können diesen Teil des Datums zu ändern/Zeitwert (z. B. Inkrementieren/Dekrementieren des Monats).Wie ein Datetime Vergrößern/Verkleinern Mausrad machen

Was ich tun möchte, ist das gleiche mit dem Mausrad zu ermöglichen. Ich habe versucht, mich bei der Veranstaltung MouseWheel anzumelden, aber ich finde keinen Weg zu wissen, welcher Teil meines Datums/Zeit gerade ausgewählt ist, so dass ich nicht weiß, ob ich die Zeit, den Tag, den Monat oder die Zeit erhöhen soll Jahr.

Gibt es eine Möglichkeit, dies zu tun?

Antwort

11

Eine mögliche, aber nicht ganz elegante Lösung wäre wie etwas sein:

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}"); 
    } 
} 

Dies sollte definitiv im allgemeinen Fall funktionieren, aber einige Ecken Fälle könnten unerwartete Ergebnisse haben (wie KeyUp/KeyDown Ereignisse überschrieben)

+0

Vielen Dank. Eigentlich habe ich selbst etwas mit einem User Control versucht, das von DateTimePicker geerbt wurde, wusste aber nicht, wie ich ein Event in den MouseWheel-Event-Handler senden konnte (probierte this.OnKeyDown, bekam aber kein Ergebnis). – Ksempac

+0

War die Welt vor 4 Jahren auf den Kopf gestellt oder steht sie jetzt auf dem Kopf? Ich habe die Funktion umgedreht, um höhere Werte beim Scrollen zu erhalten. – 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 
    } 

Referenz: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.mousewheel.aspx

+0

Nö, du meine Frage nicht beantwortet. Ich weiß, wie man das Inkrement bekommt (e.Delta ist genug für mich). Ich weiß auch, wo der Cursor (e.Location) ist, wenn ich es brauche. Was ich wissen muss ist, welcher Teil meines Datums gerade ausgewählt ist. Zum Beispiel, wenn mein Datum YYYY MM DD ist, muss ich wissen, ob der Benutzer MM, DD oder YYYY ausgewählt hat, so dass ich es erhöhen kann. Beispielsweise können Sie in einem Textfeld den Start und die Länge der Auswahl abrufen. Oder es gibt eine Funktion, die Ihnen den nächsten Index zur Position Ihres Cursors gibt. Ich habe so etwas nicht für den DateTimePicker gedacht. – Ksempac

+0

Sorry, ich habe meinen Kaffee nicht getrunken und nur den Titel gelesen;). – Fiur

0

Wenn Sie die ShowUpDown Eigenschaft auf True gesetzt Sie ein Spin-Box bekommen, anstatt ein Drop-Down und dies ändert den markierten Teil des Datums. Obwohl ich gerade herausgefunden habe, dass dies irrelevant ist, da die Auf- und Abwärtspfeiltasten den hervorgehobenen Teil des Datums ändern, unabhängig davon, ob diese Eigenschaft auf "True" gesetzt ist oder nicht.

Wenn Sie diesen Code finden, sollten Sie in der Lage sein, das Mausrad auch zu arbeiten. Ich werde einen Blick darauf werfen und sehen, was ich finden kann.

UPDATE:

Ich habe gerade diese Notiz über die ShowCheckBox Eigenschaft gefunden:

lesen/schreiben. Wenn dies der Fall ist, wird ein Kontrollkästchen links neben dem Wert des Datums in der Steuerung angezeigt. Wenn das Kontrollkästchen aktiviert ist, können die Werte im Steuerelement vom Benutzer unter Laufzeit geändert werden, indem ein Teil des Datums markiert und die Pfeiltasten gedrückt werden. Wenn nicht aktiviert, kann das Datum nur geändert werden, indem Sie auf das Dropdown-Menü klicken, um den Kalender anzuzeigen. Der Standardwert ist false.

Ist dies von Nutzen?

UPDATE 2:

Ich habe nicht in der Lage gewesen, einen Code zu finden, die mit diesem besonderen Aspekte der Datetime beschäftigt. Gibt Microsoft den Code für diese Art von Steuerelementen nicht mehr frei?

+0

Nein, ich habe ShowCheckBox bereits auf True gesetzt (weil ich das Kontrollkästchen brauche). Also, wie ich schon sagte, ich kann die Werte mit den Pfeiltasten ändern. Was ich jetzt machen möchte, ist das gleiche Verhalten mit dem Mausrad (mit hoch/runter ist ziemlich frustrierend). Das Problem ist, ich kann einen Weg finden, um herauszufinden, welcher Teil meiner Kontrolle hervorgehoben ist. – Ksempac

+0

Ich habe .NET nur für 2 Jahre ein- und ausgeschaltet, aber ich habe noch keinen internen Code von Microsoft gesehen. Alles, was ich gesehen habe, sind einige Beispiele dafür, wie sie die API nutzen, die sie anbieten. Wenn Sie Ihr eigenes Verhalten implementieren möchten, liegt es an Ihnen, die "Magie" herauszufinden, die Sie verwenden sollten. – Ksempac

+0

@Ksempac - Zurück in der dunklen und entfernten Vergangenheit von Visual C++ und MFC, die Sie in der Lage waren, etwas von dem MFC-Quellcode zu bekommen - ein unschätzbares Werkzeug, um Arbeitsaufgaben zu erledigen. MS scheint dieses Training mit C# gestoppt zu haben - es sei denn, ich habe es noch nicht gefunden. – ChrisF

0

sind nicht sicher, aber ist diese Richtung etwas Gute ..

Ist es nicht sicher, dass x-Koordinate für Monat < x für Tag < x für Jahr (unter der Annahme kein benutzerdefiniertes Format) innerhalb der Datepicker Kontrolle, wie die entlang incresing x-Achse angezeigt

dann können wir vielleicht die dateTimePicker1_MouseDown Ereignis erfassen und die x-Koordinaten zum Runterladen gesetzt, wo wir vor dem Scroll geklickt in einer variablen sagen: xCordOfClick, und diese dann Code in Fiur die Verwendung für Mausrad auf die zu erhöhen, basierend Unterschied in wo wir geklickt haben und die x-Position des Datumsspeichers.

so etwas wie

In dateTimePicker1_MouseDown (object sender, MouseEventArgs e)

{ 
     xCordOfClick = e.X; 
    } 

In Mausrad Ereignis

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

Ich benutze ein benutzerdefiniertes Format, aber das ist kein Problem, da ich derjenige bin, der es einstellt. Ich habe an so etwas gedacht, aber ich möchte es vermeiden, da es sich auf Annahmen wie die Größe der Polizei oder das Format stützt, das verwendet wird, um zu bestimmen, wie weit wir in der Kontrolle sind. – Ksempac

+0

Ich stimme zu, es ist eine grobe Art, es zu tun, mehr wie die Bildschirm-Verschrottung Welt :) .. nette Frage, obwohl –

2

Ich habe versucht, dieses herauszufinden. Am Ende landete ich mit auf den Punkt:

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 

Sie automatisch diese Prozedur mit dieser Methode auf alle Ihre Datumsauswahl in Ihre Form und die Container hinzufügen. nennen Sie es einfach einmal in 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

Verwenden 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