Überprüfen Sie das Textfeld auf negative Eingaben

Sep 08 2020

Ich versuche, ein Textfeld in einer Windows Form-Anwendung zu überprüfen. Das Textfeld nimmt eine beliebige Zahl an (es soll eine Dezimalzahl sein, aber es werden auch nur ganze Zahlen akzeptiert). Ich möchte nicht, dass die Zahl negativ ist, aber selbst nach dem Hinzufügen der if-Anweisung, selbst wenn die eingegebene Zahl eine Negation ist, akzeptiert die Anwendung sie weiterhin. Ich bin mir nicht sicher, was ich falsch mache.

try
{
    //Different operations being done here that use the input from txtEnterTotal.Text 
}
catch
{
    decimal entertotal = Convert.ToDecimal(txtEnterTotal.Text);
    if (entertotal <= 0)
    {
        MessageBox.Show("Please enter a valid number for the total field.", "Entry Error");
    }
}

Ich habe es auch versucht

catch
            {

                if (decimal.TryParse(txtEnterSubtotal.Text, out decimal value))
                {
                    if (value < 0)
                    {

                        MessageBox.Show("Please enter a valid number for the Subtotal field.", "Entry Error");
                    }
                    else
                    {
                        MessageBox.Show("thank you");
                    }
                }

            }

Ich habe eine ähnliche Frage gefunden, aber sie ist in einer anderen Sprache, die ich noch nicht gelernt habe. Da sie jedoch immer noch nach der gleichen Frage gefragt hat, habe ich einige der Antworten ausprobiert, aber ich habe immer noch Probleme. Link: Wie können Sie überprüfen, ob eine Eingabe in VB eine negative Zahl ist?

Hinweis: Ich möchte dies nur mit der try catch-Anweisung tun.

Antworten

1 GlennFerrie Sep 08 2020 at 07:47

Ich denke, der beste Weg, um zu überprüfen, ob Ihre Eingabe numerisch und dezimal ist, besteht darin, einen Code wie den folgenden zu verwenden. Als Kommentator schlug @MickyD Folgendes vor Decimal.TryParse:

try
{
    //Different operations being done here that use the input from txtEnterTotal.Text 
}
catch(Exception ex)
{
    // catch the exception and DO something with it.
    System.Diagnostics.Trace.TraceError("Error before try/parse: {0}", ex);
    //decimal entertotal = Convert.ToDecimal(txtEnterTotal.Text);
    // old code ^^^^^^
    // new code 
    if (decimal.TryParse(txtEnterTotal.Text, out decimal entertotal))
    {
        if (entertotal <= decimal.Zero)
        {
            MessageBox.Show("Please enter a valid number for the total field.", "Entry Error");
        }
    } 
    else 
    {
        MessageBox.Show(string.Format("Failed to parse value: {0}", txtEnterTotal.Text));
    }
}
RufusL Sep 08 2020 at 11:08

Ein Problem mit dem Beispielcode besteht darin, dass Sie Convert.ToDecimal(txtEnterTotal.Text)im catchBlock arbeiten. Dies txtEnterTotal.Textlöst jedoch eine Ausnahme aus, wenn keine gültige Nummer vorhanden ist, sodass die Ausnahme jetzt nicht mehr behandelt wird.

Da Sie sagen, dass Sie wirklich a verwenden möchten, try/catchum das Textfeld zu validieren, besteht das Grundmuster darin, zu versuchen, die Zahl im tryBlock zu konvertieren. Wenn dies fehlschlägt, ergreifen Sie Maßnahmen (die keine weitere Ausnahme auslösen) im catch-Block .

Beispielsweise:

private void btnValidate_Click(object sender, EventArgs e)
{
    try
    {
        // Here we perform the operation that might throw an exception
        decimal value = Convert.ToDecimal(txtEnterSubtotal.Text);

        // If we get here, no exception was thrown
        MessageBox.Show("Thank you");
    }
    catch
    {
        // Since there was an exception, show a message and clear the textbox
        MessageBox.Show("Please enter a valid, positive number");
        txtEnterSubtotal.Clear();
        txtEnterSubtotal.Focus();
    }
}

Die Verwendung try/catchfür die einfache Fehlerbehandlung ist jedoch "teuer" (das Erfassen des Aufrufstapels ist mit Kosten verbunden), und es ist auch nicht der beabsichtigte Zweck (sie sollten für außergewöhnliche Ereignisse verwendet werden, nicht für die Kontrolle des normalen Programmflusses).

Dies ist ein guter Zeitpunkt, um mehr über die TryParseMethode der numerischen Typen zu erfahren . Diese Methode verwendet a stringto parse und setzt outbei Erfolg einen Parameter vom numerischen Typ auf den konvertierten Wert. Das Beste daran ist, dass ein boolWert zurückgegeben wird, der den Erfolg anzeigt, sodass wir ihn in einer ifBedingung verwenden und Maßnahmen ergreifen können, wenn die Zeichenfolgenanalyse fehlschlägt.

Zum Beispiel könnten Sie diesen Code in Ihrer Validierungsmethode haben, für die kein a mehr erforderlich ist try/catch, da wir die Validierung TryParsestattdessen mit folgendem durchführen:

private void btnValidate_Click(object sender, EventArgs e)
{
    // Here we check if `TryParse` does NOT return true (note the exclamation mark), OR
    // if the converted number less than zero, where in either case we take some action
    if (!decimal.TryParse(txtEnterSubtotal.Text, out decimal value) ||
        value < 0)
    {
        // Show a message, then clear the textbox
        MessageBox.Show("Please enter a valid, positive number");
        txtEnterSubtotal.Clear();
        txtEnterSubtotal.Focus();
    }
    else
    {
        MessageBox.Show("Thank you");
    }
}