Laden...

Enter-Taste und Button mit Maus drücken wirkt unterschiedlich

Erstellt von Programmierfreund vor einem Jahr Letzter Beitrag vor einem Jahr 471 Views
P
Programmierfreund Themenstarter:in
3 Beiträge seit 2022
vor einem Jahr
Enter-Taste und Button mit Maus drücken wirkt unterschiedlich

Hallo,
ich bin recht neu im Programmiergame und habe hier ein Problem, dass ich nicht so ganz verstehe.
in meinem Programm soll keine zahl über 35000 als Eingabe im NumericUpDown (als alternative zur Textbox) akzeptiert werden
Stattdessen soll eine Fehlermeldung kommen. Wenn ich das Programm starte und die eine Ausführung starte, funktioniert das auch einwandfrei.
Allerding ab dem zweiten Durchlauf des Programms bei veränderter Zahl, macht das Programm einen Unterschied, ob ich die Enter-Taste auf der Tastatur drücke oder
ob ich mit der Maus auf den Button drücke. Nur Wenn ich die Enter-Taste drücke kommt die Fehlermeldung.
Ich verstehe das nicht so ganz, weil in beiden Fällen die gleiche Methoden aufgerufen werden. (Oder nicht?)

Ich habe die Vermutung, dass es mit dem EventArgs zusammenhängt und wollte auch schon KeyEventArgs schreiben, aber die anderen Methoden die darauf verweisen blockieren die Ausführung.

Wäre für hilfe dankbar.


        private void btn_start_Click(object sender, EventArgs e)
        {
            ...
        }

4.931 Beiträge seit 2008
vor einem Jahr

Hallo und willkommen,

hast du denn nicht einfach die Eigenschaft Maximum auf 35000 gesetzt? Dann wird keine Zahl größer als dieser akzeptiert und bei manueller Eingabe dann in Value der Maximalwert zurückgegeben.

Ansonsten: wie reagiert dein Code denn auf die Enter-Taste?

P
Programmierfreund Themenstarter:in
3 Beiträge seit 2022
vor einem Jahr

Ich habe das Maximum wie folgt festgelegt:


private void num_weMenge_ValueChanged(object sender, /*KeyPressEventArgs e*/  EventArgs e)
        {
            num_weMenge.Maximum = 35000;
            num_weMenge.Minimum = 2;
            btn_start_Click(sender, e);
        }

Allerdings wollte ich für den Anwender eine Info anzeigen, damit keine Missverständnisse entstehen. Dazu habe ich innerhalb der Button Methode folgendes geschrieben:


losgroesse = Convert.ToInt32(num_weMenge.Text);

            if (losgroesse > 35000)
            {
                losgroesse = 35000;
                num_weMenge.Text = losgroesse.ToString();
                MessageBox.Show("Laut der Liste Wareneingangsprüf - Tabellen ist keine höhere Stückzahl als 35000 Stück vorgesehen. Der Stichprobenumfang wurde für die Stückzahl 35000 ermittelt.");
            }

Ansonsten: wie reagiert dein Code denn auf die Enter-Taste?

Ich hoffe, ich habe die Frage richtig verstanden. Wenn ich die Enter-Taste drücke, bin ich bis jetzt der Meinung, dass der Button gedrückt und damit das Programm neu durchlaufen werden sollte. Also sollte es keinen Unterschied machen, ob ich die Enter-Taste drücke und den Butto mit der Maus betätige.
Komischerweise gilt dies auch erst ab dem zweiten durchlauf. Wenn ich das Programm starte sind alle Felder in der Ausgangssituation und ab dem zweiten Mal sind die Werte des ersten Vorgangs noch drinnen. Ich habe extra eine Taste wie "clear" oder "zurücksetzen" weggelassen, um das Programm für den Anwender einfach und schnell bedienbar zu machen.

4.931 Beiträge seit 2008
vor einem Jahr

Eigentlich sollte bei Fokuswechsel (Tab-Taste bzw. Button-Drücken o.ä.) der Text vom NumericUpDown automatisch auf den Maximalwert gesetzt werden, so daß im Code eigentlich nie ein Wert größer als der Maximalwert (bei dir also 35000) auftreten und somit abgefragt werden kann (bei meinem aktuellen Programm ist das so).

Ist der Button denn fokussiert (bzw. dieser der Eigenschaft Form.AcceptButton zugewiesen)?

PS:
Noch ein paar Code-Verbesserungen:

  • Du solltest nicht in der ValueChanged-Ereignismethode die Minimum und Maximumwerte setzen, sondern einmalig vorher (z.B. im Konstruktor bzw. direkt im Designer).
  • Es ist keine gute Idee, Ereignismethoden (wie btn_start_Click) selber aufzurufen, erzeuge am besten eine eigene (private) Methode, die du dann aus beiden Ereignismethoden aufrufst.
  • Auch wäre es besser, wenn du für 35000 eine Konstante definierst, anstatt mehrfach im Code direkt (und sogar als String-Text) zu verwenden.

Jetzt wo ich das geschrieben habe, fällt mir auf, daß genau das Setzen des Maximalwerts in der ValueChanged-Ereignismethode (sofern du diesen Wert vorher auf einen sehr großen Wert gesetzt hast - denn der Standard ist 100) zu deinem beschriebenen Verhalten führen kann. Bei der zweiten manuellen Zahleingabe und Bestätigung des OK-Buttons findet ja ein Fokuswechsel statt, d.h. dort wird dann der Value-Wert auf den Maximalwert gesetzt (und das solltest du auch in der geänderten Anzeige des NumericUpDown.Text sehen).

Edit:
Wenn du also wirklich (einmalig) eine Fehlermeldung anzeigen lassen willst, dann setze den Maximalwert von 35000 erst nach dieser (und vorher im Konstruktor auf Decimal.MaxValue oder eine andere große Zahl setzen), so daß danach dann automatisch der Value vom NumericUpDown-Control selbst bei Bedarf auf den Maximalwert gesetzt wird. Du solltest aber nur auf Value abfragen und nicht von Hand den Text parsen.

P
Programmierfreund Themenstarter:in
3 Beiträge seit 2022
vor einem Jahr

Dank deiner Hilfe habe ich es nun folgendermaßen gelöst. Ich habe für den Infotext ("Fehlermeldung") einen extra Button erstellt.


private void btn_hilfe_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Laut der Liste Wareneingangsprüf - Tabellen ist keine höhere Stückzahl als 35000 Stück vorgesehen.");
        }

Die Minimum- und Maximumwerte habe ich jetzt im Konstruktor definiert und nicht in der Methode num_weMenge_ValueChanged(object sender, EventArgs e).
Und für das Hauptprogramm habe ich nun eine extra Methode geschaffen.


private void btn_start_Click(object sender, EventArgs e)
        {
            hauptprogramm();
        }

Das mit dem AcceptButton muss ich mir nochmal genauer anschauen, aber wäre sowieso wieder ein neues Thema.
Das hat mir wirklich weitergeholfen, vielen Dank!