Laden...

[gelöst] Benutzbarkeit eines Buttons in Abhängigkeit von der Eingabe in einer TextBox steuern

Erstellt von JJPhoenix vor 15 Jahren Letzter Beitrag vor 15 Jahren 4.239 Views
J
JJPhoenix Themenstarter:in
39 Beiträge seit 2008
vor 15 Jahren
[gelöst] Benutzbarkeit eines Buttons in Abhängigkeit von der Eingabe in einer TextBox steuern

Hallo zusammen,

erst einmal wünsche ich allen ein gesundes neues Jahr.
Ich habe für die meisten wahrscheinlich nur ein kleines Problem.

Ich habe eine Form, auf der 3 Textfelder und 2 Button sind.

Einer dieser Button (der Ok-Button) soll allerdings nur dann benutzbar sein, wenn diese 3 Felder ausgefüllt sind. Allerdings will ich diesen Zustand nicht immer dann abfragen, wenn eine Eingabe in den Textfeldern erfolgt sondern irgenwie dauerhaft und kontinuierlich.

Also cmd_ok.enabled = textfeld.text<>""; so als Pseudo

Habt ihr da ne lsg oder evt nen Link dazu?

LG JJPhoenix

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo JJPhoenix,

ändere den Enabled-Status des Buttons im TextChanged-EventHandler der TextBox.

herbivore

J
JJPhoenix Themenstarter:in
39 Beiträge seit 2008
vor 15 Jahren

Na aber das muss ich dann in jedem Textfeld machen, oder wie sehe ich das?

Wollte irgendwie ne Routine haben, die das kontinuierlich prüft, oder geht das nicht so ohne Weiteres?

LG

1.200 Beiträge seit 2007
vor 15 Jahren

Ja, das musst jedem Textfeld diesen EventHandler für den TextChanged Event zuweisen.

Das ist imho auch die sauberste Lösung.

Alternativ kannst du ja einen http://msdn.microsoft.com/de-de/library/system.windows.forms.timer(VS.80).aspxTimer verwenden, der periodisch prüft. Halte ich aber für suboptimal.

Shift to the left, shift to the right!
Pop up, push down, byte, byte, byte!

YARRRRRR!

R
158 Beiträge seit 2007
vor 15 Jahren

Na aber das muss ich dann in jedem Textfeld machen, oder wie sehe ich das? rein prinzipiell ja, sonst macht es ja wohl kaum Sinn 😉

Wollte irgendwie ne Routine haben, die das kontinuierlich prüft, ...
LG

Das macht die von herbivore vorgeschlagene Methode ja...
Zur Vereinfachung abonnierst du alle drei Textboxen auf das GLEICHE TextChangedEvent und dort machst du die Überprüfung:


private void textBoxText_Changed(...) {
...
cmd_ok.Enabled = (textBox1.Text <>"") && (textBox2.Text <>"") && (textBox3.Text <>"")
...
}

Gruss Rainer

1.200 Beiträge seit 2007
vor 15 Jahren
  
private void textBoxText_Changed(...) {  
...  
cmd_ok.Enabled = (textBox1.Text <>"") && (textBox2.Text <>"") && (textBox3.Text <>"")  
...  
}  
  

Sauberste Lösung:


/* ... snip ... */

private void textBoxText_Changed(object sender, EventArgs e)
{
cmd_ok.Enabled = !(String.IsNullOrEmpty(textBox1.Text) || String.IsNullOrEmpty(textBox2.Text) || String.IsNullOrEmpty(textBox3.Text));
}


Das <> verbitte ich mir! Jawohl!

Shift to the left, shift to the right!
Pop up, push down, byte, byte, byte!

YARRRRRR!

4.221 Beiträge seit 2005
vor 15 Jahren

@GLMOD

.Text einer TextBox kann nie null sein (falls intern null wird ein string.empty zurückgegeben)

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

1.200 Beiträge seit 2007
vor 15 Jahren

Die Methode heisst ja auch: IsNullOrEmpty.

"" tut mir persönlich in den Augen weh. Zumindest sollte man gegen String.Empty checken.

Shift to the left, shift to the right!
Pop up, push down, byte, byte, byte!

YARRRRRR!

J
JJPhoenix Themenstarter:in
39 Beiträge seit 2008
vor 15 Jahren

So ist natürlich noch schicker, danke dafür!

PS das "<>" war nur Pseudo, stand ja auch da, werde es denke als bald nicht mehr verwenden....

Aber Leerzeichen überprüft "IsNullOrEmpty" net oder ?

weil mit ".trim" will das net so funzen

LG

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo JJPhoenix,

Aber Leerzeichen überprüft "IsNullOrEmpty" net oder ?

nein, nur das was der Name sagt, also (komplett) Leer.

weil mit ".trim" will das net so funzen

Mit ((TextBox)sender).Text.Trim () != "" sollte es problemlos gehen.

herbivore

4.221 Beiträge seit 2005
vor 15 Jahren

@GLMOD

Meine Bemerkung war ja auch keine Kritik 😃 sondern nur ein Hinweis dass man durch den Wegfall der Prüfung auf Null mehrere Wege offen hat.

.Text==string.Empty
.Text.Trim()string.Empty
.Text.TrimStart('0')string.Empty (z.B: bei numerischen Feldern wenn eine 0 keine Eingabe ist)...
.Text
""
.Text.Length
0

usw.

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

1.200 Beiträge seit 2007
vor 15 Jahren

Auf Leerzeichen überprüft == auch nicht, das ist beim String quasi ein Synonym für die Equals Methode.

Shift to the left, shift to the right!
Pop up, push down, byte, byte, byte!

YARRRRRR!

946 Beiträge seit 2008
vor 15 Jahren

Sauberste Lösung:

  
cmd_ok.Enabled = !(String.IsNullOrEmpty(textBox1.Text) || String.IsNullOrEmpty(textBox2.Text) || String.IsNullOrEmpty(textBox3.Text));  
  

Oder noch einfacher:

cmd_ok.Enabled = !((TextBox)sender).Length == 0;
4.221 Beiträge seit 2005
vor 15 Jahren

@C#

Er will den button erst aktiv haben wenn in ALLEN Textboxen was drin ist.

Daher ist Dein Tipp leider nicht korrekt.

Gruss
Programmierhans

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

J
JJPhoenix Themenstarter:in
39 Beiträge seit 2008
vor 15 Jahren

.Trim() ich depp hatte die () vergessen. Aus dem php kannte ich das bisher eher so trim(text) und net andersherum a la text.trim() ;-P


cmd_insert.Enabled = !(String.IsNullOrEmpty(txt_c01.Text.Trim()) || String.IsNullOrEmpty(txt_c02.Text.Trim()) || String.IsNullOrEmpty(txt_c03.Text.Trim()));

OK THX a lot!

LG

Kann dann als gelöst markiert werden

946 Beiträge seit 2008
vor 15 Jahren

@Programmierhans
Stimmt, es müsste

if (((TextBox)sender).Text.Trim().Length == 0) cmd_ok.Enabled = false;

heissen. Dann ist der Unterschied aber nicht mehr so gross.

1.200 Beiträge seit 2007
vor 15 Jahren

Das funktioniert nicht.

Der Button ist nämlich disabled und soll enabled werden. Der wird sich nicht auf wundersame Weise plötzlich von alleine enablen.

Shift to the left, shift to the right!
Pop up, push down, byte, byte, byte!

YARRRRRR!

4.221 Beiträge seit 2005
vor 15 Jahren

Also ich würd es so machen (sofern sich die Controls direkt auf demselben Container befinden).



        private void AnyTextBox_TextChanged(object sender, EventArgs e)
        {
            bool allFilled = true;
            foreach (Control c in this.Controls)
            {
                if (c is TextBox && c.Text.Trim().Length == 0)
                {
                    allFilled = false;
                    break;
                }
            }
            this.button1.Enabled = allFilled;
        }

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...