2013-05-28 18 views
7

bana şu seçmenize olanak tanıyan bir zaman seçici bir çözüm arıyorum:/aşağı saatlik yukarı yarısı saat seçici kontrolü için Looking

00:30 > 01:00 > 01:30 

bunun etrafında sarmak gerekiyor 23:30 ulaştığında 0:00 Başka bir deyişle, yukarı veya aşağı seçerek yarım saatlik bir periyodu artırmam gerekir. Bir hscroll bar eklemeyi ve timepicker'u değiştirmeyi denedim ancak bu daha kolay bir yol olması gerektiğinden şüphelendiğim için bu oldukça hassas ve gerekli değil?

Herhangi bir öneri mükemmel olurdu.

+3

için Belgeler Kullandığınız kullanıcı arabirimi çerçevesi için bir şeyler bulabilirsiniz. Nedir bu, WPF, WinForms, ASP.NET, MVC/Razor? - Düzenle: Bu soru için vov, 4 upvotes. Niye ya? Neredeyse sıfır araştırma görüyorum. Orada bir sürü UI çerçevesi var. [Telerik] 'e (http://www.telerik.com/help/winforms/editors-timepicker-overview.html) veya [bu soruya] bir göz atın (http://stackoverflow.com/questions/1046268/time -sadece-toplayıcı-için-net-Win). – CodeCaster

+0

Başıma atılan ilk şey Enumerable.Range idi, ama son çözümün neye benzediğini görmek isterdim. –

+0

Üzgünüz @CodeCaster bkz. Düzenle – CR41G14

cevap

6

Sadece-sub sınıflandırılır bunun için DomainUpDown denetimi, burada kod:

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

şöyle formunuzda denetimi ekleyin:

TimePicker picker1; 

public Form1() 
{ 
    InitializeComponent(); 

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

    Controls.Add(picker1); 
} 

Sonra almak istediğinizde

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 
} 

: seçili zaman (burada bir düğme kullanın), biz sadece SelectedItem özelliğini kullanın DomainUpDown: http://msdn.microsoft.com/en-us/library/system.windows.forms.domainupdown.aspx

+0

+1 'for' döngüsüne bir göz ağrısı ancak iyi bir uygulama biraz. –

+0

@Monkieboy El ile zaman aşımına uğradım sıkıldım xD – Sean

+0

Hata bu satırda bu.SelectedIndex = times.IndexOf ("09:00") – CR41G14

0

Ya da sadece tarih seçen bir tarih seçici seçicinizin olduğu ve 00: 00, 00.30 ... 23.00, 23.30 saatleri olan bir ComboBox yanında basit bir çözüm yapabilirsiniz. Tarih seçicinin aradığınız tam özelliklere sahip olduğu bir çözüm arıyorum. Daha iyi bir şey bulursam bu yazıyı düzenler.

DÜZENLEME:

emin değil hangi NumericUpDown bileşeni var ama ona sahip yaparsanız onunla değeri değiştiren olayı kullanabilirsiniz .net sürümleri. combobox geçmişte ne yaptın

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

Bu örnekte, sadece zamanın tarihine ihtiyacım yok. Bir damla kullanabilirdim, ne olacağını göreceğim. – CR41G14

1

listesini (2 sütun) inşa edilmiş ve sınır: İşte bazı örnek kodudur. İlk sütunlar sadece zamanı temsil eden bir dizeydi ... ikincisi buna karşılık gelen bir çift değerdi. Sonra combboox, zamanı temsile dayalı EKRAN değerini, ancak çift değerine dayalı GERÇEK değeri ... olurdu

örn: O beri biraz zaman oldu

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

ama 0'dan 23,50 (23:30 gece)

1

'a giden artışlarla basit bir döngü aracılığıyla basit bir döngü yoluyla oluşturulabilir. Bir düşünceyi kullanabileceğim tek bir yol, bir liste kontrole sahip bir liste kontrolu ile bir kullanıcı kontrolü kullanmaktır. Entegre liste kutusu kaydırma çubuğunun üstüne yerleştirilmiş ayrı dikey kaydırma çubuğu.

ListBox'ı olası değerlerle doldurun, ör. 00:00 - 23:30. Kaydırma çubuğunun Kaydırma halinde

artırmak için e.OldValue ve e.NewValue karşılaştırmasını kullanabilir veya uygun olanı öğe görülebilmesini sağlayacak şekilde, ListBoxBindingContextChanged TopIndex özelliğini azaltma ve yukarı veya aşağı gibi görünüyor.

İlk veya son öğenin gösterilip gösterilmediğini kontrol edebilirsiniz, ancak kaydırma çubuğu bu olayda bir kaydırma kaydetmeyeceğinden, bir veya daha fazla öğeyi, ilk veya son öğeyi geride bırakacak şekilde hareket ettirmeniz gerekir. etrafında kaydırma ve scollbar her zaman aktif ve Scroll olayını yükseltir.

İlgili konular