textfeld laufend auf eingabelänge überprüfen
-
hi,
ich hab ein textfeld welches ich laufend auf die eingabelänge überprüfen will.
bei erreichter länge soll ein button selektiert werden. dazu erstelle ich
beim laden der form einen thread der das textfeld in einer while schleife
auf die länge prüft.die form blockiert aber trotzdem obwohl die abfrage in einem eigenen thread
läuft.kann mir jemand sagen wo hier mein denkfehler liegt?
private void TEST_Load(object sender, EventArgs e) { System.Threading.Thread newThread; newThread = new System.Threading.Thread(checkText); newThread.Start(); } void checkText() { if (txtTest.InvokeRequired) { txtTest.Invoke(new MethodInvoker(checkText)); return; } while(true) { if(txtTest.Text.Length > 2) break; } }
-
Klassischer Fall von Overkill, würd ich mal sagen.
Nimm einfach den TextChanged-Event der Textbox her und prüfe im Event-Handler, welche Länge der eingegebene Text erreicht hat. Dann kannst du deinen Button aktivieren und auch wieder deaktivieren, wenn Zeichen aus der Textbox gelöscht werden.
-
danke für die antwort. das mit dem TextChanged-Event war mir schon klar.
das mit der textbox abfrage hab ich nur als beispiel verwendet. es kann auch
irgendwas anderes in der while schleife gemacht werden. mich würde nur interessieren wieso die form blockiert wird.
-
du hast in deiner while-schleife keinen Sleep-Befehl. der thread durchläuft die schleife also extrem oft und lastet somit deine anwendung total aus. mach also einen Thread.Sleep(1) rein, dann sollte es gehen.
-
obwohl, ich habe nochmal drüber nachgedacht. am anfang des threads rufst du ja direkt den invoke-befehl vom formular auf. somit gibst du die methode an das formular weiter. das bedeutet, dass dein thread schon nach dem return beendet ist. die while schleife wird dann vom hauptthread (vom formular) ausgeführt und bringt somit alles zum stillstand.
Gruß Ape
-
xxmaxx schrieb:
danke für die antwort. das mit dem TextChanged-Event war mir schon klar.
das mit der textbox abfrage hab ich nur als beispiel verwendet.Okay, aber dann stell die Frage nächstes mal auch anders bzw. frag nach dem, was du erreichen willst. Das ist mir nämlich immer noch nicht klar. Vmtl. willst du in kurzen zeitlichen Abständen irgendwas prüfen, aber kp.
mich würde nur interessieren wieso die form blockiert wird.
Ist doch klar. Der neue Thread wird gestartet und da du auf ein Element eines anderen Threads (des GUI-Threads) zugreifen willst, ist InvokeRequired true, das heißt die Methode ruft sich über Invoke selbst im GUI-Thread auf.. da ist dann InvokeRequired false, denn du bist im GUI-Thread. Ergo läufst du im GUI-Thread in die while-true Schleife und die blockiert die Eingabe. Somit kann die if-Bedingung durch Benutzereingabe nie true werden.
-
Ape schrieb:
das bedeutet, dass dein thread schon nach dem return beendet ist.
Neee.. das return-Statement wird nie ausgeführt. Schließlich kehrt das Programm nie aus dem Invoke-Aufruf zurück, weil es dort ja vor sich hinloopt.
-
GPC schrieb:
xxmaxx schrieb:
danke für die antwort. das mit dem TextChanged-Event war mir schon klar.
das mit der textbox abfrage hab ich nur als beispiel verwendet.Okay, aber dann stell die Frage nächstes mal auch anders bzw. frag nach dem, was du erreichen willst. Das ist mir nämlich immer noch nicht klar. Vmtl. willst du in kurzen zeitlichen Abständen irgendwas prüfen, aber kp.
Und man sollte vielleicht noch anmerken, dass in dem Fall, wo du in kurzen zeitlichen Abständen etwas prüfen möchtest, dies definitiv der falsche Ansatz wäre.
Grüssli
-
ok wieso das gui blockiert wird hab ich verstanden.
Und man sollte vielleicht noch anmerken, dass in dem Fall, wo du in kurzen zeitlichen Abständen etwas prüfen möchtest, dies definitiv der falsche Ansatz wäre
was genau wäre so falsch daran das so zu machen?
-
Weil das, wie es ein Professor von mir mal so schön erklärt hat, in etwa so wäre, wie alle zwei Sekunden vor die Tür zu sehen ob jemand da ist anstatt auf die Glocke zu hören...