Validierung von Daten im Formular

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von AndPod.

    Validierung von Daten im Formular

    Hallo
    ich steige gerade von Access auf VB um und stehe bei manchen Sachen echt auf dem Schlauch. Aktuell versuche ich mich an der Überprüfung von Eingaben.
    Im unten angehängten Formular habe ich 2 Textboxen (Eingabe erforderlich) sowie mehrere Checkboxen (Eingabe optional). Über die ComboBox werden die einzelnen Datensätze ausgewählt.
    Das überprüfen der 2 Textfelder auf Inhalt ist erstmal kein Problem (mittels Validating in jeder einzelnen Textbox). Wie stelle ich aber nun fest, ob an einem neuen Datensatz überhaupt etwas verändert, sprich ein optionales Feld verändert wurde ohne diese alle einzeln zu überprüfen? Wenn nichts geändert wurde soll der "neue Datensatz" verworfen werden.

    Gruß, André
    Bilder
    • FormValidate.png

      6,91 kB, 514×323, 146 mal angesehen

    AndPod schrieb:

    Wie stelle ich aber nun fest, ob an einem neuen Datensatz überhaupt etwas verändert
    Darum muss man sich eiglich garnet kümmern, denn das Dataset hat eine Änderungsverfolgung eingebaut.

    Wenn du also mit DataAdaptern beliebige Daten aus einer DB lädst, änderst aber nix daran, und rufst DataAdapter.Update() auf, dann sendet der keinen einzigen Datensatz an die DB.
    Ich hoffe, das ist mit "Verwerfen" gemeint.
    Normalerweise ist "Verwerfen" ja das Gegenteil: Man macht lauter Änderungen, und klickst dann aber Cancel - und die Änderungen werden nicht wirksam.
    Ja, das habe ich schon durch, hat aber nicht alle Fragen beantwortet.
    Wie gesagt, ich brauche eine Validierung des Datensatzes, wenn das Formular geschlossen werden soll, ein anderer Datensatz ausgewählt wird oder ein neuer Datensatz erstellt werden soll. Ich habe bei beiden Textboxen unter "Validating" Cancel auf True gesetzt wenn das Feld leer ist.

    Quellcode

    1. Private Sub BenutzerrechtTextBox_Validating(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles BenutzerrechtTextBox.Validating
    2. If Me.BenutzerrechtTextBox.Text = Nothing Then
    3. Me.lblError.Text = "Bitte Benutzerrecht angeben"
    4. e.Cancel = True
    5. End If
    6. End Sub


    Hat zwar seinen Vorteil das man nicht mehr aus der Textbox raus kommt wenn nichts drin steht, allerdings bei einem leeren Datensatz auch nicht. Ich müsste also die Überprüfung irgendwo anders unterbringen (Form.Validating?). Nur wie kann ich darauf reagieren, das der Datensatz leer ist und dieser dann verworfen wird? Und was muss ich noch tun damit die Validierung auch beim wechseln des Datensatzes mittels der Combobox durchgeführt wird?
    Momentan frägst du ab ob die Box leer ist, die ist halt leer.
    Also frag lieber ab ob was drin steht und wenn das stimmt kannst du das ja validieren lassen. Musst halt wenn Text.Length größer 0 ist überprüfen ob die Eingabe richtig ist.

    VB.NET-Quellcode

    1. If BenutzerrechtTextBox.Text.Length > 0 Then
    2. Else
    3. End If


    So kann die TextBox leer sein und man kann trotzdem weiter. bzw. das Programm beenden

    Gruß,
    Drahuverar
    Option Strict On!
    naja - üblicherweise haperts ganz woanders, nämlich an der Kommunikation mitte Datenbank, und an der Verwendung eines typisierten Datasets.

    Nämlich solange du kein typisiertes Dataset verwendest, und deine Controls daran bindest, solange haperts.
    Da kann man dann viel mit Events rauf und runter herumprobieren, ist alles nur recht jämmerlich, und man versucht sowas nur, weil man typDataset und Databinding nicht kennt.
    Sobald man aber iwann den Stand der Technik erlernt hat, tritt man das ganze andere Gekrepel eh in die Tonne, daher halte ich's garnet für sinnvoll, da jetzt iwas zu beraten, was dir weiterhilft auf deim Weg - weil der ja so gesehen vermutlich ein Hokzweg ist.

    Aber vlt. tu ich dir ja unrecht, und du verwendest bereits ein typDataset, Databinding, sowie DataAdapter.
    Wenn ich mich nicht ganz in den Begrifflichkeiten irre verwende ich ein typisiertes Dataset. Die Anwendung hängt an einer MySQL Datenbank. Die Steuerelemente sind alle gebunden, aus diesem Grund verabschiedet sich die Anwendung auch sobald eines der beiden Textfelder leer ist und ich z.B. die ComboBox auswähle.
    Bilder
    • Dataset.png

      9 kB, 1.123×264, 126 mal angesehen
    ah - wunderbar!

    also wenn du einen bestehenden Datensatz editierst, dann kanns ja garnet vorkommen, dass ein Textfeld leer ist, weil das ist ja an eine Property gebunden.
    Es sei denn, der Datensatz hat diese Property nicht gesetzt, aber dann ist das offsichtlich gültig, und sollte daher nicht abstürzen.
    Die bestehenden Datensätze sind ja nicht das Problem. Es sind eher die neuen. Sobald ich in eine der 2 Textboxen etwas eingetragen habe kann ich diese ja verlassen und auf alles andere klicken. Und wenn ich dann aus was für Gründen auch immer auf die ComboBox klicke und mir einen anderen Eintrag aussuche schmiert halt die Anwendung ab weil die 2. Textbox leer ist. Und ich möchte nun wissen wo ich da noch eine Validierung einbauen muss.
    Ich werde mir wohl erstmal damit helfen das ich alles bis auf den Speichern-Button deaktiviere sobald ein neuer Datensatz angelegt wird, das betrachte ich aber erstmal nur als Workaround. Bleibt aber immer noch die Frage wie ich die Eingabe eines neuen Datensatzes abbreche.
    Es handelt sich um eine NoNullAllowedException (beide Textfelder sind in der Datenbank als erforderlich markiert). Wenn ich einen Datensatz bearbeite ist es kein Problem, der Nutzer kann das Textfeld dank Validating nicht verlassen solange das Feld leer ist. Nun legt man aber einen neuen Datensatz an, damit sind ja erstmal beide Felder leer. Wenn ich jetzt in das aktive Feld etwas rein schreibe kann ich es auch verlassen da für dieses Feld die Validierung erfolgreich ist. Wenn ich jetzt ohne das zweite Feld zu befüllen auf Speichern klicke oder aus der ComboBox einen anderen Eintrag auswähle kommt halt der Fehler. Von daher war meine Frage, wo ich die Validierung platzieren muss, damit beim Speichern bzw. Datensatzwechsel die Daten des aktuellen Datensatzes validiert werden.
    wie gesagt: Mit dem DefaultValue-Feature kann man das umgehen.

    Also wenn du magst, kannste meine englische Artikelserie mal kurz überfliegen, ob was dabei ist, was du noch nicht kennst. Ich glaub im mittleren Artikel empfehle ich DefautlValues: codeproject.com/Articles/1033145/Databinding-for-Beginners

    Edit: nee, warnix. DefaultValue wird zwar empfohlen, aber ist leider auf keim Bildle mit drauf, wie eins gesetzt ist.

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

    ErfinderDesRades schrieb:


    Evtl. kann man das Problem mit neuen Datensätzen dadurch lösen, dass man DefaultValues im Dataset-Designer anlegt.


    Das wäre eine Möglichkeit über die ich nachdenke. Zusätzlich werde ich wohl erstmal wie oben erwähnt alle Elemente sperren, welche zum "anlegen" eines Datensatzes nicht benötigt werden. Es wäre trotzdem interessant zu wissen ob sich eine Validierung auf den Datensatz umsetzen lässt, bevor dieser zu einen anderen (Auswahl ComboBox) gewechselt wird.
    Bezüglich des Default-Wertes. Ich habe für die Checkboxen in der MySQL ein Feld von Typ TinyInt(1) mit dem DefaultWert 0. Trotzdem werden mir die Checkboxen wie oben auf dem Screenshot ersichtlich nicht als "False" markiert. Komisch. Ich schau mir mal deinen verlinkten Artikel an.