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)
{
...
}
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?
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.
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:
ValueChanged
-Ereignismethode die Minimum
und Maximumwerte
setzen, sondern einmalig vorher (z.B. im Konstruktor bzw. direkt im Designer). btn_start_Click
) selber aufzurufen, erzeuge am besten eine eigene (private) Methode, die du dann aus beiden Ereignismethoden aufrufst.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.
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!