Datagridview Standartfehlermeldung umgehen

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von VB-and-Me.

    Datagridview Standartfehlermeldung umgehen

    Guten Tag!
    Ich habe in meinen gebundenen Datagridview eine Spalte mit Format Date. Wenn ich eine Zelle dieser Spalte verlasse, ohne ein gültiges Datum eingetragen zu haben, kommt das Standartdialogfeld für Datagridview. Durch eine DataError-Sub kann ich dies verhindern. Lasse ich diese Sub leer, kommt keine Fehlermeldung; die Zelle kann ich weiterhin erst nach Eintrag eines Datums verlassen. Nun möchte ich, dass beim Verlassen der Zelle ohne gültiges Datum automatisch das Datum 1.1.0001 eingetragen wird.
    Mein Versuch:

    VB.NET-Quellcode

    1. Private Sub BriefTblDGV_DataError(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewDataErrorEventArgs) Handles BriefTblDGV.DataError
    2. BriefTblDGV.Item(8, BriefTblDGV.CurrentRow.Index).Value = ("1.1.0001")
    3. End Sub

    ...aber die Zelle bleibt leer und wartet weiterhin auf ein gültiges Datum.
    Wer kann mir weiterhelfen?

    Besteht vielleicht sogar die Möglichkeit, eine solche Zelle ganz leer zu lassen?

    Danke!
    Viele Grüße
    el
    Das Datum "1.1.0001" ist leider nicht definiert, da in der Zwischenzeit mindestens eine (große) Kalienderreform stattgefunden hat (julianischer -> gregorianischer Kalender). Die Tage 5. bis 14. Oktober 1582 gab es nicht.
    Und damit wollen wir unser Windows doch nicht belasten.
    Gugge DateTime.MinValue.
    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 danke beiden für die raschen Antworten!

    An EdR: AllowNull war bereits true und bei DefaultValue ist <DBNull> eingetragen.

    An RodFromGermany: Ich hatte meine Daten von einer List of ... in das Datagridview übertragen. Dabei wurde bei Datenfeldern, in denen in der List of ... kein Datum eingetragen war, automatisch im Datagridview der 1.1.0001 angezeigt. Dieses Datum wird auch jetzt beim Eintrag über die Tastatur akzeptiert, es wird korrekt im DGV sortiert und dient für mich als Hinweis, dass eigentlich kein Datum eingetragen werden sollte.

    An beide: Schöner wäre es natürlich, wenn die Zelle leer bleiben könnte.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VB-and-Me“ ()

    VB-and-Me schrieb:

    Schöner wäre es natürlich, wenn die Zelle leer bleiben könnte.
    Da musste Dir ein Validate bauen, dass da halt nix einträgt.
    Musste Dich aber selbst drum kümmern.
    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!
    Herzlichen Dank!

    VB.NET-Quellcode

    1. Private Sub BriefTblDGV_DataError(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewDataErrorEventArgs) Handles BriefTblDGV.DataError
    2. Me.Validate()
    3. end Sub


    So wird eine leere Zelle akzeptiert und auch korrekt sortiert. Ob ein Datum in der Zelle eingetragen ist, kann ich mit ... is dbnull.value abfragen.

    An EdR: Deinen Link werde ich mir morgen zu Gemüte führen.

    Herzlichen Dank!
    Einen schönen Abend wünscht
    el
    Guten Tag!
    Ich möchte das Problem mit dem Datum 1.1.0001 nochmals aufgreifen:
    Zwischenzeitlich funktioniert das Freilassen des Datumfeldes, das Feld bleibt auch nach dem Einlesen der XML-Datei frei.
    Wenn ich allerdings das DataTable mit der EB-Liste fülle (hier wurde EB.Fälligdat bei leerem Feld nothing gesetzt), erscheint weiterhin im Datagridview das Datum 1.1.0001. Wie kann ich erreichen, dass auch in diesem Fall das Feld leer bleibt?

    Mein Code zum Speichern der EB-Liste:

    VB.NET-Quellcode

    1. ' das Datagridview in der EB-Liste speichern
    2. Private Sub SpeichernInEBListeToolStripMenuItem_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles SpeichernInEBListeToolStripMenuItem.Click
    3. Me.validate()
    4. ' die alte EB-Liste löschen
    5. EB.Clear()
    6. ' jede Zeile aus dem Datagridview ergibt einen EB-Brief
    7. For i = 0 To BriefTblDGV.RowCount - 2
    8. Dim neuerBrief As New Brief
    9. With neuerBrief
    10. .Nennwert = CDbl(BriefTblDGV.Item(0, i).Value)
    11. .Kurs = CDbl(BriefTblDGV.Item(1, i).Value)
    12. .WPName = CStr((BriefTblDGV.Item(2, i).Value))
    13. .Anteile = CDbl(BriefTblDGV.Item(4, i).Value)
    14. .Anteilswert = CDbl(BriefTblDGV.Item(5, i).Value)
    15. .Zinsstufen = CInt(BriefTblDGV.Item(6, i).Value)
    16. .Zinssatz(1) = CDbl(BriefTblDGV.Item(7, i).Value)
    17. '.FälligDat = CDate(BriefTblDGV.Item(8, i).Value)
    18. If BriefTblDGV.Item(8, i).Value Is DBNull.Value Then
    19. .FälligDat = Nothing
    20. Else
    21. .FälligDat = CDate((BriefTblDGV.Item(8, i).Value))
    22. End If
    23. If BriefTblDGV.Item(9, i).Value Is DBNull.Value Then
    24. .ZinsDat = " "
    25. Else
    26. .ZinsDat = CStr(BriefTblDGV.Item(9, i).Value)
    27. End If
    28. .WKN = CStr(BriefTblDGV.Item(10, i).Value)
    29. .Bank = CStr(BriefTblDGV.Item(11, i).Value)
    30. .vorzeitig = CBool(BriefTblDGV.Item(12, i).Value)
    31. .Art = CStr(BriefTblDGV.Item(13, i).Value)
    32. End With
    33. EB.Add(neuerBrief)
    34. Next
    35. Call BriefListeSpeichern(Pfad1, EB)
    36. Label1.Text = "Es wurden " & EB.Count.ToString & " Datensätze in der EB-Liste gespeichert"
    37. End Sub


    Mein Code zum Einlesen der EB-Liste:

    VB.NET-Quellcode

    1. Private Sub TabelleFüllenMitEBListeToolStripMenuItem_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles TabelleFüllenMitEBListeToolStripMenuItem.Click
    2. Me.validate()
    3. 'das DataTable löschen und damit auch das Datagridview leeren, sonst sind beim 2. Aufruf der frmTabelle alle Daten doppelt
    4. DataSet1.BriefTbl.Clear()
    5. 'Lesen der Daten aus der EB-Liste:
    6. For i = 0 To EB.Count - 1
    7. With EB(i)
    8. 'der aktuelle Wert aktWertX wird nicht in der EB-Liste gespeichert, sondern jedesmal neu berechnet
    9. Dim aktWertX As New Double
    10. If .Nennwert > 0 Then
    11. If .Kurs = 0 Then
    12. aktWertX = .Nennwert
    13. Else
    14. aktWertX = .Nennwert * .Kurs / 100
    15. End If
    16. Else
    17. aktWertX = .Anteile * .Anteilswert
    18. End If
    19. aktWertX = Math.Round(aktWertX, 2) ' mit 2 Nachkommastellen
    20. ' damit kann eine ganz Zeile an das datatable übergeben werden
    21. DataSet1.BriefTbl.AddBriefTblRow(.Nennwert, .Kurs, .WPName, aktWertX, CInt(EB(i).Anteile), .Anteilswert, _
    22. .Zinsstufen, .Zinssatz(1), .FälligDat, .ZinsDat, .WKN, .Bank, .vorzeitig, .Art, CInt(i))
    23. End With
    24. Next
    25. 'Tabelle nach FälligDatum sortieren (Spalte 8)
    26. BriefTblBindingSource.Sort = "FälligDatum Asc"
    27. BriefTblBindingSource.Position = (0)
    28. Label1.Text = EB.Count.ToString & " Datensätze aus EB-Liste"
    29. End Sub


    Vielen Dank!
    Freundliche Grüße
    el
    Genau solch muss in der Prozedur Validate() stehen.
    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!
    Vielen Dank für Deine Antwort!
    Nun habe ich also eine Validate-Procedure gebastelt:

    VB.NET-Quellcode

    1. Private Overloads Sub Validate()
    2. 'das DataTable löschen und damit auch das Datagridview leeren, sonst sind beim 2. Aufruf der frmTabelle alle Daten doppelt
    3. DataSet1.BriefTbl.Clear()
    4. 'Lesen der Daten aus der EB-Liste:
    5. For i = 0 To EB.Count - 1
    6. With EB(i)
    7. 'der aktuelle Wert aktWertX wird nicht in der EB-Liste gespeichert, sondern jedesmal neu berechnet
    8. Dim aktWertX As New Double
    9. If .Nennwert > 0 Then
    10. If .Kurs = 0 Then
    11. aktWertX = .Nennwert
    12. Else
    13. aktWertX = .Nennwert * .Kurs / 100
    14. End If
    15. Else
    16. aktWertX = .Anteile * .Anteilswert
    17. End If
    18. aktWertX = Math.Round(aktWertX, 2) ' mit 2 Nachkommastellen
    19. '' damit kann eine ganz Zeile an das datatable übergeben werden
    20. DataSet1.BriefTbl.AddBriefTblRow(.Nennwert, .Kurs, .WPName, aktWertX, CInt(EB(i).Anteile), .Anteilswert, _
    21. .Zinsstufen, .Zinssatz(1), .FälligDat, .ZinsDat, .WKN, .Bank, .vorzeitig, .Art, CInt(i))
    22. ' Me.Validate()
    23. End With
    24. Next
    25. 'Tabelle nach FälligDatum sortieren (Spalte 8)
    26. BriefTblBindingSource.Sort = "FälligDatum Asc"
    27. BriefTblBindingSource.Position = (0)
    28. Label1.Text = EB.Count.ToString & " Datensätze aus EB-Liste"
    29. TabelleSpeichernToolStripMenuItem.Enabled = True
    30. MitSpeichernInXMLDateiToolStripMenuItem.Enabled = True
    31. End Sub


    Aber es wird weiterhin das Datum 1.1.0001 eingetragen.
    Ob das Ganze doch ein bisschen zu hoch für mich ist??? Oder kannst Du mir doch noch einen Tipp geben?
    Eigentlich brauche ich es ja nicht wirklich, da das Ganze mit der XML-Datei funktioniert. Es ist für mich nur von akademischem Interesse: warum erscheint im gleichen Datagridview einmal bei der Übergabe von Nothing ein leeres Feld und einmal 1.1.0001? Das ist für mich als VB-Laie nicht nachvollziehbar.
    Vielen Dank für Deine Geduld!

    Nun habe ich doch noch den Fehler gefunden!
    Die betreffende Spalte des Datagridview hatte ich mit Format d formatiert! Nach Löschen dieser Formatierung bleiben auch die entsprechenden Zellen leer.
    :) :) :)
    Danke allen, die mitgeholfen haben!
    Freundliche Grüße
    el

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VB-and-Me“ ()