Mehrfache Bedingung

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von Kangaroo.

    Mehrfache Bedingung

    Hallo,

    in einer Form habe ich 8 Testfelder. In alle Felder müssen Zahlen >0 rein.

    Wie mache ich eine Mehrfach-Bedingung dafür ?

    VB.NET-Quellcode

    1. If a>0 and b>0 and c>0 ....
    2. then
    3. ....
    4. else
    5. ...
    6. End if


    Finde das etwas unübersichtlich. Geht das auch anderes? Und wie bekomme ich es hin, das andere Werte ausser Zahlen (Buchstaben, Sonderzeichen)
    ebenfalls im else-Bereich landen?

    Gruss
    AndAlso
    Integer.Parse()/Double.Parse()
    „Was daraus gefolgert werden kann ist, dass jeder intelligentere User sein Geld lieber für Bier ausgibt, um einen schönen Rausch zu haben, und nicht dieses Ranzprodukt.“

    -Auszug aus einer Unterhaltung über das iPhone und dessen Vermarktung.

    noxx schrieb:

    Finde das etwas unübersichtlich. Geht das auch anderes? Und wie bekomme ich es hin, das andere Werte ausser Zahlen (Buchstaben, Sonderzeichen)
    ebenfalls im else-Bereich landen?

    Willst Du denn überhaupt zulassen dass solche Werte eingegeben werden ? Falls nein prüfst Du im KeyPress Event Deiner Textboxen die Tastatureingabe und unterdrückst die Eingabe von Nicht-Ziffern per e.handled=true -> KeyPress-Event
    statt Variablen von a bis h kannst du eine Liste nehmen.

    VB.NET-Quellcode

    1. Dim eingaben as new list(of string)
    2. 'Die Liste füllen
    3. 'eingaben.add(dein Text) halt 8 mal machen
    4. dim allewahr as boolean=false
    5. for i as integer=0 to 7
    6. if isnumeric(eingaben(i)) andalso CInt(eingaben(i))>0 then
    7. allewahr=true
    8. else
    9. allewahr=false
    10. exit for
    11. end if
    12. next
    13. if allewahr then
    14. 'hier sind alle variablen zahlen und größer 0
    15. else
    16. 'hier nicht
    17. end if

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    picoflop schrieb:

    Indem du keine Textbox nimmst (die ist ja für TEXT wie der Name schon sagt), sondern ein NumericUpDown.

    Ein NumericUpDown für eine Zahl und nicht nur eine Ziffer ? *hust*

    So ein plattes Statement hatte ich von Dir nicht erwartet: eine Textbox kann man erben und durch Abfangen von Events (KeyPress, TextChanged) auf die speziellen Bedürfnisse anpassen , das weisst Du selber ganz genau. Für sehr strukturierte Eingaben gäbe es dann noch die MaskedTextbox, die aber in diesem Fall wohl nicht so greift.

    Naja, vielleicht zu späte Uhrzeit ...

    Kangaroo schrieb:

    Ein NumericUpDown für eine Zahl und nicht nur eine Ziffer ? *hust*

    ?
    In alle Felder müssen Zahlen >0 rein.

    Es geht um die Eingabe von Zahlen. Dafür wurde das NUD geschaffen.

    eine Textbox kann man erben und durch Abfangen von Events (KeyPress, TextChanged) auf die speziellen Bedürfnisse anpassen

    Ich kann auch ne Listbox nehmen und mit viel Arbeit so abwandeln, dass es ne Combobox wird. Oder ich nehm gleich ne Combobox ...

    picoflop schrieb:

    Ich kann auch ne Listbox nehmen und mit viel Arbeit so abwandeln, dass es ne Combobox wird. Oder ich nehm gleich ne Combobox ...

    Schmarrn.

    Das wesentliche/störende Element am NUD (auf Microsoft neudeutsch Drehfeld) ist das UpDown Element, mit dem ich das Feld um bestimmte Werte hoch- bzw. runterclicken kann. Wenn es nur um freie Zahleneingaben geht, so stört dat Dingens manche Leute immens, mich einbegriffen. Man stelle sich vor es sind freie Werte zwischen 1- 1 Million erlaubt: klar, ich kann das im NUD auch manuell eingeben, aber das UpDown-Element ist hier ja wohl total überflüssig.

    Also kreiere ich mir lieber eine NumericTextbox, die ausschliesslich numerische Eingaben zulässt. Schon vergessen, daß Inheritance irgendwie zu den Grundlagen von OOD gehört ?

    Ab ins Bett Pico, ich denke Du brauchst dringend Deinen Schönheitschlaf ;)
    Simplifiziert:

    VB.NET-Quellcode

    1. Public Class Form1
    2. ' your normal code
    3. End Class
    4. ' NumericTextbox Class, which allows only numeric input: should actually be in another file
    5. Public Class NumericTextBox
    6. Inherits TextBox
    7. Protected Overrides Sub OnKeyPress(ByVal e As System.Windows.Forms.KeyPressEventArgs)
    8. MyBase.OnKeyPress(e)
    9. Select Case e.KeyChar
    10. ' allow only numeric characters
    11. Case "0"c, "1"c, "2"c, "3"c, "4"c, "5"c, "6"c, "7"c, "8"c, "9"c
    12. ' suppress all other characters
    13. Case Else : e.Handled = True
    14. End Select
    15. End Sub
    16. End Class


    Wenn Du diesen Code kompilierst, so kannst du die NumericTextBox sogar aus der Toolbox auf Deine Form ziehen

    noxx schrieb:

    weihe mich ein :)
    alternativ einfach meine Lösung nutzen.
    Bei Kangaroos Beitrag sollte beachtet werden, dass zum Beispiel die Backspace und Entfernen-Tasten auch nicht mehr funktionieren werden.

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    vb-checker schrieb:

    Bei Kangaroos Beitrag sollte beachtet werden, dass zum Beispiel die Backspace und Entfernen-Tasten auch nicht mehr funktionieren werden.

    Korrekt, daher hatte ich auch 'simplifiziert' geschrieben . Die zulässigen Tastatureingaben (Backspace, Delete, ArrowLeft, etc) zu ergänzen, sollte allerdings auch Dir nicht schwerfallen.

    Alternativ gehen auch Lösungen über das TextChanged Event oder das LostFocus Event, oder sonstige Kombinationen mit der vorgestellten Lösung, um Tastatureingaben zu prüfen.

    Grundsätzlich halte ich eher mehr davon, die Eingaben im Ursprung so weit wie möglich zu begrenzen, als im Nachhinein die Prüfungen vorzunehmen: schliesslich, was soll sonst die Aktion sein wenn eine Eingabe unzulässig ist ? Alle Eingabefelder (auch zulässige) wieder löschen ?

    Kangaroo schrieb:

    Grundsätzlich halte ich eher mehr davon, die Eingaben im Ursprung so weit wie möglich zu begrenzen, als im Nachhinein die Prüfungen vorzunehmen

    volle Zustimmung.

    Aber soo einfach ist eine sichere NumericTextbox eben doch nicht, v.a., wenn du auch Kommazahlen zulassen willst.

    Und für Backspace, Delete brauchst du zusätzlich das KeyDown-event, und mußt mitte Keys-Enumeration umgehen.

    Das einfachste sichere scheint mir tatsächlich das Nud. Ist zwar inne Bedienung bischen lästig, weils Nud keine VollSelection macht, wenn mans mit Tab betritt, aber das ist IMO auch schon der ganze Nachteil eines Nuds gegenüber einer Textbox.

    ErfinderDesRades schrieb:

    Aber soo einfach ist eine sichere NumericTextbox eben doch nicht, v.a., wenn du auch Kommazahlen zulassen willst.

    Stimme Dir da (bedingt) zu, jedenfalls wenn man eine komfortable NumericTextbox für alle Arten von Eingaben (Integer, Minus-, Decimalzahlen) haben möchte. Zum Beispiel die Unterdrückung aller unzulässigen Chars direkt bei der Eingabe , z.B. eines 2ten Dezimalpunktes. Aber auch das ist mit verhältnismässigem Aufwand zu realisieren und bestimmt wiederverwertbar.

    Anders sieht es für eine reine Integerlösung aus so hatte ich (vielleicht falsch) die Aufgabenstellung verstanden, da ist die Umsetzung ziemlich simpel . Eine noch faulere Lösung wäre es nur im LostFocus Event oder evtl TextChanged Event per TryParse auf korrekten Inhalt abzufragen. Nicht schön, aber wer es einfach haben mag ...

    ErfinderDesRades schrieb:

    Das einfachste sichere scheint mir tatsächlich das Nud. Ist zwar inne Bedienung bischen lästig, weils Nud keine VollSelection macht, wenn mans mit Tab betritt, aber das ist IMO auch schon der ganze Nachteil eines Nuds gegenüber einer Textbox.

    Beisst Du Dir da in der Argumentation nicht in den Schwanz .. sry das Bein ? Das NUD unterstützt soweit ich mich erinnere nur Integer Zahlen, also nix Kommazahlen , da musst Du Dir dann eh was anderes einfallen lassen (man schlage mich wenn ich mich irre)

    Kangaroo schrieb:

    wenn ich mich irre
    (das ist aber nur beim Schach so, dass man geschlagen wird, wenn man sich irrt ;))

    grad geguckt: Nud stellt sogar eine Property "DecimalPlaces" bereit

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

    ErfinderDesRades schrieb:

    Nud stellt sogar eine Property "DecimalPlaces" bereit
    Korrekt.
    Moin EDR ;)
    Sonst würde ja Integer als Typ des Values genügen, ist aber glücklicherweise Decimal.
    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!