Kontrolle auf korrekte Eingabe bei mehreren Eingabefeldern - bessere Lösung gesucht

  • C#

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Grimsey.

    Kontrolle auf korrekte Eingabe bei mehreren Eingabefeldern - bessere Lösung gesucht

    Hallo zusammen,

    ich habe eine kleine Anwendung über die 43 Energiezählerwerte erfasst werden sollen. Die Eingabe der Zählerstände erfolgt manuell.
    Bei der Eingabe würde ich gerne prüfen, dass nur Zahlen im Format double eingegeben werden.
    Ich habe dazu eine Lösung, bin damit aber nicht zufrieden da ich den Code mehrfach leicht abgeändert benutzen müsste.
    Ich nutze derzeit das TextChanged-Event und prüfe dann für jede Eingabe. Das scheint mir aber sehr umständlich, da ich das für alle 43 Zähler separat machen müsste. Bei Änderungen müsste ich dann wieder alle Zähler anfassen....das scheint mir etwas überholt zu sein.

    Gibt es vielleicht einen eleganteren Weg, die Eingaben z.B. über eine allgemeine Funktion zu prüfen und dieser das zu prüfende Controll zu übergeben?

    C#-Quellcode

    1. protected void txtbxTrafoHauptzähler1_TextChanged(object sender, EventArgs e)
    2. {
    3. bool ok = false;
    4. double temp;
    5. ok = Double.TryParse(txtbxTrafoHauptzähler1.Text,out temp);
    6. if (ok)
    7. {
    8. txtbxTrafoHauptzähler1.BackColor = Color.LightGreen;
    9. txtbxTrafoHauptzähler2.Focus();
    10. }
    11. else
    12. {
    13. txtbxTrafoHauptzähler1.BackColor = Color.Red;
    14. txtbxTrafoHauptzähler1.Focus();
    15. }
    16. }
    17. protected void txtbxTrafoHauptzähler2_TextChanged(object sender, EventArgs e)
    18. {
    19. bool ok = false;
    20. double temp;
    21. ok = Double.TryParse(txtbxTrafoHauptzähler2.Text, out temp);
    22. if (ok)
    23. {
    24. txtbxTrafoHauptzähler2.BackColor = Color.LightGreen;
    25. txtbxTrafoPH3.Focus();
    26. }
    27. else
    28. {
    29. txtbxTrafoHauptzähler2.BackColor = Color.Red;
    30. txtbxTrafoHauptzähler2.Focus();
    31. }
    32. }
    33. protected void txtbxTrafoPH3_TextChanged(object sender, EventArgs e)
    34. {
    35. bool ok = false;
    36. double temp;
    37. ok = Double.TryParse(txtbxTrafoPH3.Text, out temp);
    38. if (ok)
    39. {
    40. txtbxTrafoPH3.BackColor = Color.LightGreen;
    41. txtbxLagerhalleHauptzähler.Focus();
    42. }
    43. else
    44. {
    45. txtbxTrafoPH3.BackColor = Color.Red;
    46. txtbxTrafoPH3.Focus();
    47. }
    48. }
    Bilder
    • Zähler eintragen.png

      16,17 kB, 670×233, 56 mal angesehen
    Hallo,

    ich hab schon lange kein WinForms mehr gemacht, würde aber trotzdem mal einen Vorschlag abgeben.

    An deiner Stelle würde ich alle Textboxen einer Liste hinzufügen. Dann kannst du diesen Textboxen noch allen die gleiche "TextChanged" Methode zuweisen und in dieser dann anhand des senders unterscheiden, welche Textbox geklickt wurde. Damit auch immer zur nächsten Textbox weitergeeschaltet wird, musst du schauen, dass diese in der Liste in der richtigen Reihenfolge sind. Dafür würde ich den Textboxen in der Tag-Eigenschaft eine Nummerierung zuweisen und dann die Liste einfach danach sortieren lassen.

    Hier mal mein Code.

    Das muss irgendwo am Anfang hin - z.B. bei Form_Load (dort fügst du die Elemente einer Liste hinzu und sortierst diese - außerdem gibts du allen die Methode tb_TextChanged mit...)

    C#-Quellcode

    1. textBoxes = new List<TextBox>();
    2. foreach (var ctl in Controls)
    3. {
    4. if (ctl.GetType() == typeof(TextBox))
    5. {
    6. TextBox tb = (TextBox)ctl;
    7. tb.TextChanged += tb_TextChanged;
    8. textBoxes.Add(tb);
    9. }
    10. }
    11. textBoxes = textBoxes.OrderBy(x => x.Tag).ToList();




    Und hier jetzt die Methode tb_TextChanged (der sender ist die Textbox auf die gecklickt wurde):

    C#-Quellcode

    1. private void tb_TextChanged(object sender, EventArgs e)
    2. {
    3. bool ok;
    4. double temp;
    5. TextBox tb = (TextBox)sender;
    6. ok = Double.TryParse(tb.Text, out temp);
    7. if (ok)
    8. {
    9. tb.BackColor = Color.LightGreen;
    10. int index = textBoxes.IndexOf(tb);
    11. if (index < textBoxes.Count -1 ) textBoxes[index+1].Focus();
    12. }
    13. else
    14. {
    15. tb.BackColor = Color.Red;
    16. tb.Focus();
    17. }
    18. }



    Ich hoffe das war einigermaßen verständlich, wenn du Fragen hast frag einfach nochmal.


    Viele Grüße
    Florian


    PS: Es gibt vielleicht noch elegantere Lösungen, die müssen dann aber die WinForms Leute bringen :)
    ----

    WebApps mit C#: Blazor
    @Grimsey Mach Dir eine von TextBox abgeleitete Klasse DoubleTextBox, die Du dort überall einsetzt.
    Im KeyDown-Event lässt Du nur die Tasten passieren, die erlaubt sind: 0-9, Dezimalseparator (der ist abhängig von der Kultur!), die Edit-Tasten.
    Damit C&P nicht funktioniert, müsstest Du die WndProc() überschreiben.
    stackoverflow.com/questions/51…n-a-textbox-using-c-sharp
    Wenn Du noch weitere Feature brauchst, z.B. den Double-Wert auslesen und solch, kannst Du alles da reinpacken.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich würde da ein NumericUpDown Control anstatt der Textbox verwenden.
    Das stellt sicher, dass nur brauchbare Eingaben gemacht werden können.

    Edit: Ich sehe gerade, dass das ASP.Net ist.
    Dann hilft vielleicht TextMode="Number"
    stackoverflow.com/questions/16…pdown-control-for-asp-net
    stackoverflow.com/questions/31…-to-a-textbox-type-number
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „petaod“ ()

    Ich danke Euch allen für Eure Hilfe!

    Mir hat die korrekte Abfrage der Controls innerhalb der Event-Methode gefehlt bzw. war mir nicht klar, wie ich die Textboxen allgemein ansprechen kann.
    Mit dem Cast in Textbox klappt es prima, wenn ich diese Methode allen Textboxen zuweise.

    Die andere Möglichkeit mit dem Parameter "Number" klappt auch super! Da habe ich letztens wohl einen Fehler gemacht, als ich das getestet habe.
    Gibt man da etwas anderes als Zahlen ein, wird die Textbox rot umranded und zeigt auch so die Fehlerstelle an.
    Damit spart man sich die separate Methode.

    Jetzt habe ich 2 mögliche Wege, danke!


    [EDIT]: jetzt weiß ich wieder was da stört, wenn man den Eingabetyp auf Number stellt: man kann nur ganze Zahlen eingeben, keine Komma-Werte
    [EDIT2]: NumericUpDown-Extension scheint gut zu funktionieren, dafür sollte man aber den Eingabewert wieder auf Singleline stellen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Grimsey“ ()