Laden...

Positionswert eines bewegenden Labels in zweiten Label anzeigen

Erstellt von WesMPipes vor 7 Jahren Letzter Beitrag vor 7 Jahren 2.437 Views
W
WesMPipes Themenstarter:in
4 Beiträge seit 2016
vor 7 Jahren
Positionswert eines bewegenden Labels in zweiten Label anzeigen

Hallo liebe Community

ich bin während meines Studiums noch ziemlich am Anfang mit der Entwicklung in c#.
Nach ein paar Konsolen-Anwendungen, mache ich nun die ersten Schritte in Windows-Forms.

Im Zuge einer bewerteten Aufgabe, soll ich ein Programm erstellen, wo ein Label mit beliebigen Inhalt in mehreren Durchläufen von oben nach unten "wandern" lassen soll. Ausgelöst durch den Klick auf einen Button. So weit so gut.

Ich habe ein Klick-Event erstellt und so wie es soll, läuft mein Label mehrmals von oben nach unten.

Mein Klick-Event sieht so aus:


private void btnStart_Click(object sender, EventArgs e)
        {

            for (int runde = 0; runde < 10; runde++)
            {
                for (int schritt = 0; schritt <= 300; schritt++)
                {

                    lblWander.Top = schritt;
                    System.Threading.Thread.Sleep(20);

                }
            }

            Close();

        }

Nun war meine Idee, dass ich den Labeltext nach jedem Schritt in die aktuellen Schritt-Wert ändere.
Also habe ich die "innere" Schleife noch um folgende Zeile erweitert:



lblWander.Text = Convert.ToString(schritt);


Ich hätte jetzt erwartet, dass bei jedem Schritt nach unten, sich im Label auch der Text ändert - macht er aber nicht - das Label wird "unsichtbar" und ich kann den Text nicht mehr sehen.

Erst wenn die Schleife durchlaufen und das Programm am Ende angekommen ist (den Aufruf der Close-Methode hab ich später erst reingebaut), wird dann im Label der letzte Wert von schritt (300) angezeigt.

Was muss noch passieren, damit ich die Änderung des Wertes auch während der Laufzeit im Label sehe?

Anmerkung: dass sich der Text im Label ändern muss, ist nicht Teil der Aufgabe und wird auch nicht bewertet. Ich habe es für mich eher als Fleißaufgabe gesehen. Und da ich es nicht verstehe, aber gerne verstehen möchte, bitte ich Euch um Versteh-Hilfe.

Vielen Dank
Gruß

Wes

PS: Ich hoffe das hier ist das "Anfänger-Forum" und der Post ist hier richtig - wenn nicht, bitte ich um Nachsicht.

709 Beiträge seit 2008
vor 7 Jahren

Hallo und willkommen WesMPipes,

schau mal hier: [FAQ] Warum blockiert mein GUI?

Edit:
Später könnte das hier auch noch interessant sein: [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke)

3.003 Beiträge seit 2006
vor 7 Jahren

Du musst ein Neuzeichnen des Controls erzwingen.

Invalidate
Update
Refresh

Dass dein Form blockiert, hast du ja sicher bemerkt, dafür hilft dann pinkis Hinweis.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

W
WesMPipes Themenstarter:in
4 Beiträge seit 2016
vor 7 Jahren

Vielen Dank Euch beiden für Eure Antworten - ich werde mir das mal alles durchlesen.

Wobei beim Überfliegen des Blockier-Threads schon einige Fragezeichen aus meinem Kopf gesprudelt sind. Ich glaube, da greife ich meinem c#-Lehrgang etwas vor...

Grus
Wes

S
322 Beiträge seit 2007
vor 7 Jahren

Hallo,

probier mal ob du mit der Timer-Komponente (Windows.Forms.Timer) zurecht kommst. (hier kleines Tutorial dazu http://www.c-sharpcorner.com/UploadFile/mahesh/C-Sharp-timer/)
Dieser löst immer ein Ereignis aus wenn die eingestellte Zeit abgelaufen ist.

Gruß
Steffen

W
WesMPipes Themenstarter:in
4 Beiträge seit 2016
vor 7 Jahren

Also das mit der Refresh-Methode habe ich hinbekommen und Alles (ausser dass das Form noch blockiert) läuft so, wie ich es mir optisch vorgestellt habe. Danke @ LaTino

@ steffen_dec, @ pinki - Danke, das schau ich mir auch noch in Ruhe an.

Gruß

Wes

3.003 Beiträge seit 2006
vor 7 Jahren

Dank der nicht mehr ganz taufrischen async/await-Syntax ist das ganze sehr, sehr einfach zu schreiben (die Mechanik dahinter ist dagegen nicht ganz so simpel, aber Rom wurde auch nicht an einem Tag erbaut 😉 ).

Ergänze deine Methode um das Schlüsselwort "async", ersetze System.Threading.Thread.Sleep(20) durch await Task.Delay(20); - und das war es.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

W
WesMPipes Themenstarter:in
4 Beiträge seit 2016
vor 7 Jahren

LaTino
...
Ergänze deine Methode um das Schlüsselwort "async", ersetze System.Threading.Thread.Sleep(20) durch await Task.Delay(20); - und das war es.

👍

Ich denke mal die Mechanik dahinter werde ich im Laufe meines Lehrgangs (hoffentlich) noch begreifen.
Bis dahin gebe Ich mich erst mal damit zufrieden, dass es perfekt funktioniert 😁
Danke schön

Gruß
Wes