2013-05-28 6 views
7

Suche nach einer Lösung für eine Zeitauswahl, die mir folgendes auswählen können:der Suche nach Zeit Aufnehmersteuersystem mit halbstündlich nach oben/unten

00:30 > 01:00 > 01:30 

Wenn es 23.30 Uhr erreicht sie herum wickeln muss bis 0:00 Uhr.

Mit anderen Worten muss ich einen halbstündigen Zeitraum erhöhen, indem Sie nach oben oder unten wählen. Ich habe versucht, eine hscroll bar aufzunehmen und eine timepicker zu ändern, aber das ist ziemlich empfindlich und un-notwendig aus meiner Sicht, da ich vermute, dass es einen einfacheren Weg geben muss?

Alle Vorschläge wären hervorragend.

+3

Vielleicht finden Sie etwas für das UI-Framework, das Sie verwenden. Was ist das, WPF, WinForms, ASP.NET, MVC/Razor? - Bearbeiten: wow, 4 upvotes für diese Frage. Warum? Ich sehe fast keine Forschung. Es gibt Unmengen an UI-Frameworks. Sehen Sie sich [Telerik] (http://www.telerik.com/help/winforms/editors-timepicker-overview.html) oder [diese Frage] an (http://stackoverflow.com/questions/1046268/time) Nur-Pickers-für-Net-Winforms). – CodeCaster

+0

Das erste, was mir in den Sinn kam, war Enumerable.Range, aber es würde mich interessieren zu sehen, wie die Endlösung tatsächlich aussieht. –

+0

Sorry @CodeCaster siehe bearbeiten – CR41G14

Antwort

6

ich nur untergeordnete eine DomainUpDown Kontrolle, dies zu tun, hier ist der Code:

class TimePicker : DomainUpDown 
{ 
    public TimePicker() 
    {   
     // build the list of times, in reverse order because the up/down buttons go the other way 
     for (double time = 23.5; time >= 0; time -= 0.5) 
     { 
      int hour = (int)time; // cast to an int, we only get the whole number which is what we want 
      int minutes = (int)((time - hour) * 60); // subtract the hour from the time variable to get the remainder of the hour, then multiply by 60 as .5 * 60 = 30 and 0 * 60 = 0 

      this.Items.Add(hour.ToString("00") + ":" + minutes.ToString("00")); // format the hour and minutes to always have two digits and concatenate them together with the colon between them, then add to the Items collection 
     } 

     this.SelectedIndex = Items.IndexOf("09:00"); // select a default time 

     this.Wrap = true; // this enables the picker to go to the first or last item if it is at the end of the list (i.e. if the user gets to 23:30 it wraps back around to 00:00 and vice versa) 
    } 
} 

das Steuerelement zu dem Formular hinzufügen wie folgt:

TimePicker picker1; 

public Form1() 
{ 
    InitializeComponent(); 

    picker1 = new TimePicker(); 
    picker1.Name = "timePicker"; 
    picker1.Location = new Point(10, 10); 

    Controls.Add(picker1); 
} 

Dann, wenn wir das bekommen gewählte Zeit (ich benutze einen Knopf hier), verwenden wir einfach die SelectedItem Eigenschaft:

private void button1_Click(object sender, EventArgs e) 
{ 
    MessageBox.Show(picker1.SelectedItem.ToString()); // will show "09:00" when 09:00 is selected in the picker 
} 

Dokumentation für DomainUpDown: http://msdn.microsoft.com/en-us/library/system.windows.forms.domainupdown.aspx

+0

+1 'for' Schleife ist ein bisschen ein Auge wund, aber gute Umsetzung. –

+0

@Monkieboy Ich habe es gelangweilt, die Zeiten mit der Hand zu tippen xD – Sean

+0

Fehler in dieser Zeile this.SelectedIndex = times.IndexOf ("09:00") – CR41G14

0

Oder Sie könnten eine einfache Lösung, wo Sie einen Datum-Uhrzeit-Picker haben, der nur das Datum und daneben eine ComboBox, die die Zeiten haben 00.00, 00.30 ... 23.00, 23.30. Ich schaue mir eine Lösung an, bei der die Datumsauswahl die genaue Funktion hat, nach der Sie suchen. Werde diesen Beitrag bearbeiten, wenn ich etwas besseres finde.

EDIT:

nicht sicher, welche Versionen von .net, die die NumericUpDown Komponente haben, aber wenn Sie es tun haben, können Sie den Wert geändert Ereignis mit verwenden. Hier ist ein Beispielcode:

decimal previousValue = 0; 
    DateTime time = new DateTime(2000, 6, 10, 0, 0, 0); 
    bool justChanged = false; 
    private void numericUpDown1_ValueChanged(object sender, EventArgs e) 
    { 
     if (justChanged) 
     { 
      justChanged = !justChanged; 
      return; 
     } 
     else 
      justChanged = !justChanged; 

     if (numericUpDown1.Value < previousValue) 
      time = time.AddMinutes(-30); 
     else 
      time = time.AddMinutes(30); 

     numericUpDown1.Value = decimal.Parse(time.ToString("HH,mm")); 

     previousValue = numericUpDown1.Value; 
    } 
+0

Ich brauche das Datum in diesem Fall nicht, nur die Zeit. Ich könnte einen Drop-Down verwenden, werde sehen, was kommt. Danke – CR41G14

1

Was ich in der Vergangenheit getan habe, wurde eine Liste (2 Spalten) erstellt und an die Combobox gebunden. Die erste Spalte war nur eine Zeichenfolge, die die Zeit darstellt ... die zweite war ein doppelter Wert entsprechend. Dann wird die combboox, würde ich die DISPLAY-Wert auf der Zeitdarstellung haben basiert, aber der tatsächliche Wert basiert auf dem doppelten Wert ...

ex:

Display Actual 
00:00 = 0.0 
00:30 = 0.5 
01:00 = 1.0 
.... 
12:30 = 12.5 
13:00 = 13.0 
etc. 

Es da, dass einige Zeit gewesen ist, aber könnte über eine einfache Schleife in Schritten von 0,5 zwischen 0 und 23,50 (23:30 Nacht) generiert werden

1

Eine Möglichkeit, die ich mir vorstellen kann, ist ein Benutzersteuerelement mit einer ListBox mit integraler Höhe zu einem Element und a separate vertikale Bildlaufleiste, die über der integrierten Listbox-Bildlaufleiste platziert wird.

Füllen Sie die ListBox mit möglichen Werten, z. 00:00 bis 23:30.

Im Scroll-Ereignisse der Scrollbar benutzen Sie den Vergleich von e.OldValue und e.NewValue zu erhöhen oder zu verringern, die TopIndex Eigenschaft der List-Box, so dass der sachgemäße Artikel gezeigt wird, und es erscheint Scrollen nach oben oder unten zu sein.

Sie könnten dann prüfen, ob das erste oder letzte Element angezeigt wird, aber da die Bildlaufleiste keinen Bildlauf in diesem Ereignis registriert, sollten Sie ein oder mehrere Elemente nach dem ersten oder letzten Element verschieben, damit es scheinbar erhalten bleibt Umwickeln und die Scollbar ist immer aktiv und löst ihr Scroll-Ereignis aus.