Eintrag bereits vorhanden?

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von MichaHo.

    Eintrag bereits vorhanden?

    Hallo,

    ich muss doch noch einmal auf meine Brillen Datenbank zu sprechen kommen.

    wie kann ich es erreichen das wenn in der Spalte "Modell" ein Modell eingegeben wird, das bereits vorhanden ist, das dann eine Messagebox gezeigt wird?

    Also wenn ich in einer neuen Zeile in der Spalte "Modell" eine Eingabe tätige, sollte beim Verlassen der Zelle geprüft werden ob das Modell im Dataset schon vorhanden ist.

    Ich habe hier im Forum bei einem ähnlichen Thema eine Funktion von @ErfinderDesRades gefunden:

    VB.NET-Quellcode

    1. Public Function GetRowExists(ByVal word As String) As Boolean
    2. Return Me.DataSet1.Fassung.Any(Function(rw) rw.Modell = word)
    3. End Function


    soweit verstehe ich die Funktion, aber wie definiere ich "word", also wie komme ich an den Inhalt der aktiven Zelle dran um dann in einem Ereignis die Funktion aufrufen zu können.

    Die Textbox der Spalte habe ich "txtModell genannt"

    Mein Versuch mit:

    VB.NET-Quellcode

    1. Private Sub dgvFassung_CellLeave(sender As Object, e As DataGridViewCellEventArgs) Handles dgvFassung.CellLeave
    2. If GetRowExists(txtModell.ToString) Then
    3. MessageBox.Show("Gibts schon")
    4. End If
    5. End Sub


    klappt natürlich nicht

    Könnt ihr mir bitte nen tip geben.

    Vielleicht geht es auch einfacher direkt über die Bindingsource, aber ich weis halt nicht wie ich an den Inhalt der gerade aktiven zelle drann komme.

    Danke Euch

    Michael
    "Hier könnte Ihre Werbung stehen..."
    Den Text einer Textbox erhälst du nicht durch Textbox.ToString, sondern da solltest du die Textbox.Text-Property abrufen - weil die enthält den Text (deswegen heißt sie auch so ;) ).

    Eine Extra-Methode GetRowExists() brauchst du dafür nicht - es ist doch schon ein Einzeiler:

    VB.NET-Quellcode

    1. Private Sub dgvFassung_CellLeave(sender As Object, e As DataGridViewCellEventArgs) Handles dgvFassung.CellLeave
    2. If DataSet1.Fassung.Any(Function(rw) rw.Modell = txtModell.Text) Then
    3. MessageBox.Show("Gibts schon")
    4. End If
    5. End Sub


    Allerdings fällt das Thema unter Validierung von Eingaben, und da solltest du nicht das CellLeave-Event nutzen, sondern allenfalls das CellValidating.
    Letzteres bietet im ValidatingEventArgs auch die Möglichkeit e.Cancel=True zu setzen, um eine ungültige Eingabe abzuwehren.

    Achso - validiert werden soll ja die Textbox-Eingabe - also hier am DGV zu schrauben ist ja ganz die falsche Baustelle.

    Also verwende das txtModell_Validating - Event, wenn du die txtModel-Textbox validaten willst (Nomen est Omen!).

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

    @ErfinderDesRades
    Wenn man direkt in der Tabelle bei der Spalte 'Modell' eine Einschränkung auf eindeutige Werte einstellt (Unique-Eigenschaft),
    könnte man im DataError-Ereignis des DGV die ConstraintException abfangen und dann die Eingabe ändern bzw. wieder verwerfen.
    Ich weis jetzt nicht, ob dieser Weg gescheit ist?
    Ja, das sollte man eh machen, einfach um Datenkonsistenz zu garantieren - ganz unabhängig vonne Oberfläche.

    Aber Problem hier ist ja, dass nicht übers Grid eingegeben wird, sondern über eine Detail-Textbox. Also muss so oder so ValidierungsCode für die Textbox her.

    @TE: Das Validierungs-Konzept von WinForms ist übrigens noch viel umfassender, bei Interesse guggemol activevb.de/tipps/vbnettipps/tipp0083.html .

    Und auch das ist im Grund überholt, bzw ist nur die halbe Miete. (Die annere Hälfte baut auf dem IDataErrorInfo-Interface auf, welches von Datenklassen implementiert wird)
    Hallo,

    ich habe aber keine extra Textbox, sondern ich habe den Namen der DataGridviewTextBoxColum auf txtModell geändert.

    ich habe bei MSDN noch etwas gefunden und msdn.microsoft.com/de-de/library/7ehy30d4(v=vs.110).aspx

    irgendwie klappt das Zusammenspiel noch nicht, denn jetzt ist es so das der Fehler direkt auftritt sobald die Form gestartet ist, also er denkt auch bei den bestehenden schon das die vorhanden sind. (ist ja auch so) er soll aber erst gucken, wenn ich eine eingabe in einer neuen Zeile beginne.

    der jetzige Code (mit der Änderung von EDR) sieht so aus:

    VB.NET-Quellcode

    1. Private Sub dgvFassung_CellEndEdit(sender As Object, e As DataGridViewCellEventArgs) Handles dgvFassung.CellEndEdit
    2. dgvFassung.Rows(e.RowIndex).ErrorText = String.Empty
    3. End Sub
    4. Private Sub dgvFassung_CellValidating(sender As Object, e As DataGridViewCellValidatingEventArgs) Handles dgvFassung.CellValidating
    5. Dim headerText As String = dgvFassung.Columns(e.ColumnIndex).HeaderText
    6. If Not headerText.Equals("Modell") Then Return
    7. If OptHartDS.Fassung.Any(Function(rw) rw.Modell = e.FormattedValue.ToString()) Then
    8. dgvFassung.Rows(e.RowIndex).ErrorText = "Dieses Modell ist bereits vorhanden"
    9. e.Cancel = True
    10. End If
    11. End Sub


    ich denke das Problem ist die Stelle rw.Modell = e.FormattedValue.ToString() hier müsste ich halt wissen, welchen wert oder inhalt ich an rw.Modell übergeben muss. (eigentlich der Inhalt der Zelle, die ich gerade bearbeite...

    Das mit der Unique Eigenschaft hört sich auch gut an, wie geht das da genau?

    EDIT:

    @VB1963 und @ErfinderDesRades:

    Die Lösung kann manchmal echt Einfach sein..... die Unique Eigenschaft der Spalte Modell auf True setzen und schon ist das Thema erledigt :)
    Nur dazu eine Frage, wie oder wo kann ich diese Unsägliche Fehlermeldung ändern? oder gegen eine eigene austauschen?

    EDIT2: habs gefunden und nun Klappt es wunderbar, auch wenn meine Frau das Problem erst beim beenden der Reihe feststellt :)

    VB.NET-Quellcode

    1. Private Sub dgvFassung_DataError(sender As Object, e As DataGridViewDataErrorEventArgs) Handles dgvFassung.DataError
    2. MessageBox.Show("Dieses Modell ist bereits vorhanden !", "ACHTUNG: Datensatz vorhanden!", MessageBoxButtons.OK, MessageBoxIcon.Warning)
    3. End Sub

    "Hier könnte Ihre Werbung stehen..."

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

    Einfach im DataError-Ereignis eine Fehlerbehandlung durchführen und die Eingabe behandeln...

    VB.NET-Quellcode

    1. Private Sub DeinDGV_DataError(sender As Object, e As DataGridViewDataErrorEventArgs) Handles DeinDataGridView.DataError
    2. If e.Context = DataGridViewDataErrorContexts.Commit Then
    3. If TypeOf (e.Exception) Is ConstraintException Then
    4. Dim Result = MessageBox.Show(String.Concat("Es sind keine Duplikate erlaubt.", Environment.NewLine, "Wollen Sie den Datensatz weiter bearbeiten?"),
    5. "Achtung!!!", MessageBoxButtons.YesNo, MessageBoxIcon.Error)
    6. e.Cancel = (Result = DialogResult.Yes) ' Werte nochmals editieren oder ganze Zeile verwerfen
    7. End If
    8. End If
    9. End Sub

    MichaHo schrieb:

    ich habe den Namen der DataGridviewTextBoxColum auf txtModell geändert.
    Fies!
    der "txt"-Prefix ist doch für Textboxen!
    Für DGVColumns nimm den Prefix "clm"!

    So gesehen biste im DGV-CellValidating dann doch richtig.

    Bzw. diese DGV-Schreckens-Fehlermeldung (ich erschrecke immer, wenn die kommt) - sagt dir doch selbst, was zu tun ist (wennde es denn tun willst): "Behandeln Sie das DGVDataError-Ereignis."
    Ich bin nicht so der Freund dieses Events, weil das feuert auch bei ganz anderen DataErrors - das ist ganz schön knifflig, in jedem Fall richtig drauf zu reagieren.

    Also angenommen, ein Depp gibt "hallo" ein in eine Spalte, wo nur Zahlen zulässig sind, und du behandelst das DataError-Event mit deiner Meldung "Gibts schon!" - also das wird dem User keine große Hilfe sein - eher im Gegenteil.
    Danke @VB1963 Die Fehlerbehandlung ist deutlich besser als meine eigene 8o

    @ErfinderDesRades

    Ich glaub soweit bin ich noch nicht das ich die ganzen Fehlerbehandlungen richtig hin bekomme

    Bei
    meinem ersten Versuch habe ich ja das CellValidating Ereignis genutzt,
    aber das hat schon beim Starten der Anwendung gemotzt weil es
    festgestellt hat, das das Modell in der ersten Zeile schon vorhanden
    ist.... ist es ja auch, ist aber auch richtig, denn es wurde ja mal
    gespeichert.
    Die Möglichkeit wäre mir lieber, da meine Frau dann
    direkt beim eingeben des Modells schon sieht das was falsch ist, bei der
    jetzigen merkt sie es ja erst, wenn sie die komplette zeile schon
    eingegeben hat und in die nächste springt....
    Hier nochmal der Code den ich vor der Uniqe eigenschaft hatte:

    VB.NET-Quellcode

    1. Private
    2. Sub dgvFassung_CellValidating(sender As Object, e As
    3. DataGridViewCellValidatingEventArgs) Handles dgvFassung.CellValidating
    4. Dim headerText As String = dgvFassung.Columns(e.ColumnIndex).HeaderText
    5. If Not headerText.Equals("Modell") Then Return
    6. If OptHartDS.Fassung.Any(Function(rw) rw.Modell = e.FormattedValue.ToString()) Then
    7. dgvFassung.Rows(e.RowIndex).ErrorText = "Dieses Modell ist bereits vorhanden"
    8. e.Cancel = True
    9. End If
    10. End Sub

    "Hier könnte Ihre Werbung stehen..."

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