Entwickler-Ecke

WinForms - Zeit aktualisieren


Ccenter - Fr 25.09.09 21:51
Titel: Zeit aktualisieren
Hi,
ich habe ein Problem:
Ich habe ersteinmal ein Timer eingesetzt dessen Interval 1000 beträgt.
So, wenn man das Programm startet, wird die aktuelle Zeit ermittelt mit


C#-Quelltext
1:
2:
3:
4:
private void label1_Paint(object sender, PaintEventArgs e)
        {
            this.label1.Text = DateTime.Now.Hour.ToString() + ":" + DateTime.Now.Minute.ToString() + ":" + DateTime.Now.Second.ToString();
        }


und in einem Label ausgegeben. Leider wird die Zeit nicht akualisiert und hier liegt auch mein Problem. Wie lässt sich sowas realisieren?

Ich habe es schon mit einer Schleife probiert aber das haut irgendwie nicht hin. Desweiteren habe ich irgendwo etwas von einem "Tick-Event" gelesen, aber nichts genaueres dazu gefunden, z.b. wie man das verwendet.


jaenicke - Fr 25.09.09 23:37

Du sagst etwas von einem Timer, aber warum benutzt du diesen denn dann nicht?

Das Ereignis Paint des Labels wird genau dann ausgelöst... zum Zeichnen. ;-)

Und genau wie dieses Ereignis musst du das Ereignis Tick des Timers benutzen. Dieses wird in dem eingestellten Intervall immer wieder ausgelöst.


Ccenter - Sa 26.09.09 13:55

Hm...ok ich dachte immer das "DateTime.Now" nur funktioniert, wenn der Timer eingesetzt ist.
Ich verstehe aber nicht ganz, was ich jetzt mit dem Tick-Event des Timers machen muss.

Bezüglich dem Paint-Event des Labels, ist das falsch?


Christian S. - Sa 26.09.09 14:02

user profile iconCcenter hat folgendes geschrieben Zum zitierten Posting springen:
Ich verstehe aber nicht ganz, was ich jetzt mit dem Tick-Event des Timers machen muss.

Bezüglich dem Paint-Event des Labels, ist das falsch?
Ja, das mit dem Paint-Event ist nicht richtig. Das hieße, dass Du den Text des Labels bei jedem Neuzeichnen setzt, was keinen wirklichen Sinn macht. Das passiert entweder zu oft oder zu selten, aber nicht sekündlich ;-)

Das Tick-Event ist die Lösung für Dein Problem: Du setzt im Tick-Event den Inhalt das Labels. Den Timer stellst Du auf ein vernünftiges Intervall, wobei 1000ms für eine sekundengenaue Anzeige schon zu lang ist, denn je nach Startzeitpunkt des Timers hast Du dann bis zu 999ms zu spät die korrekte Uhrzeit.


Ccenter - Sa 26.09.09 14:39

Ok, der Timerinterval ist jetzt auf 100.
Das mit dem Ticker verstehe ich aber noch nicht so ganz. Denn das hier ist ja wohl falsch:


C#-Quelltext
1:
2:
3:
4:
private void timer1_Tick(object sender, EventArgs e)
        {
           Label1.Text = DateTime.Now.Hour + ":" + DateTime.Now.Minute + ":" + DateTime.Now.Second;
        }


Zumindest funktioniert es nicht.


Christian S. - Sa 26.09.09 14:53

Ist der Timer denn aktiviert (Enabled = true)?


Ccenter - Sa 26.09.09 16:07

Ah es geht. Vielen dank^^
Ich hatte den Timer nicht auf True gesetzt.


JüTho - Sa 26.09.09 17:36

Hallo,

Die Zuweisung der Uhrzeit an das Label ist zwar nicht wirklich falsch, aber ungünstig. Label.Text ist vom Typ String; DateTime.Hour usw. sind vom Typ Integer. Der Compiler kann das zwar automatisch konvertieren; im Interesse eines typgenauen Arbeitens sollte aber "String = String" und nicht "String = int" verwendet werden. Dafür bietet DateTime schöne Routinen mit vielen Überladungen, wo du dir eine passende aussuchen kannst:

C#-Quelltext
1:
2:
3:
currentTimeLabel.Text = DateTime.Now.ToShortTimeString();
// oder 
currentTimeLabel.Text = DateTime.Now.ToString("T");

Erläuterungen siehe in der SDK-Doku/MSDN unter DateTime, DateTime.ToString-Methode mit Überladungen, DateTimeFormatInfo.

Jürgen