Cell Validating Event - Change Cell content

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Peter329.

    Cell Validating Event - Change Cell content

    Hi,

    Ich habe eine DataGridView. In dieser View mache ich Eingaben im EditMode. Diese Eingaben will ich prüfen und entweder ablehnen oder ggfs. annehmen und korrekt formatieren.

    Dazu habe ich das CellValidating Event ausgewählt, weill ich da über e.FormattedValue Zugriff auf den eingegebenen Zelleninhalt habe.

    Die Prozedur VerifyCell(i, j, NewValue) prüft den neuen Zelleninhalt und liefert (via ByRef) den entsprechend veränderten Zelleninhalt zurück.

    So sieht das Coding aus:

    VB.NET-Quellcode

    1. Private Sub DgvLogRecords_CellValidating(sender As Object, e As DataGridViewCellValidatingEventArgs) Handles DgvLogRecords.CellValidating
    2. LblMessage.Text = ""
    3. 'Get indexes
    4. Dim i = e.RowIndex
    5. If i = -1 Then Exit Sub
    6. Dim j = e.ColumnIndex
    7. If j = itmMaintenanceCategory.Index Then Exit Sub
    8. 'Edit new value (other than Category)
    9. Dim NewValue = e.FormattedValue.ToString
    10. Dim ret = VerifyCell(i, j, NewValue) 'NewValue is defined as ByRef
    11. If ret <> "" Then 'ret is the message if not valid
    12. LblMessage.Text = ret
    13. DgvLogRecords.CancelEdit() 'restores previous value
    14. Exit Sub
    15. End If
    16. 'Format Cell - DOES NOT WORK
    17. DgvLogRecords.Item(j, i).Value = NewValue 'New Value is dd.MM.yyyy or "n2"
    18. End Sub


    So sieht das Ergebnis aus: die originalen Eingaben werden NICHT verändert.

    Die Spalte Valuta ist in der Dgv als Datum ("d") definiert ... und natürlich habe ich NewValue mit Tostring("dd.MM.yyyy") in die gewünsche Form gebracht. Ähnliches gilt für die Dezimale Spalte "Debit".


    Egal was ich mache ... die Eingaben werden nicht angepasst. Aus irgendeinem Grund kommt mein NewValue in der Dgv nicht an ...

    Ich hoffe, ich habe mein Problem genügend klar machen können. Wie kann ich in der CellValidating Routine den Zelleninhalt formattieren ....

    LG
    Petger
    Bilder
    • s 2025-03-12 10-39-198.jpg

      26,55 kB, 908×68, 12 mal angesehen
    Welches Ergebnis erwartest Du? Wo findet die Umwandlung statt?
    Für Datum wäre ich ab Zeile#20 bei:

    VB.NET-Quellcode

    1. DgvLogRecords.Item(j, i).Value = Date.Parse(NewValue) 'aus dem String ein Datum machen
    2. DgvLogRecords.RefreshEdit() 'Zeile updaten, da sonst erst beim nächsten Selektieren der Wert angezeigt wird


    Wenn Du der DGV-Zelle nen String gibst, wird daraus kein Datum oder eine Zahl. Es geht bei dem Darstellungsformat eigentlich nur darum, wie das Datum oder die Zahl dargestellt wird, wenn ein entsprechender Wert da auch reingesetzt wird. Es findet keine Typumwandlung von String in Irgendwas statt.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

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

    Du musst das Edit der Zelle abbrechen oder beenden, bevor du den Wert ändern kannst.
    z.B. kannst du das DgvLogRecords.CancelEdit() von Zeile 20 zwischen Zeile 13 & Zeile 14 verschieben.

    VB.NET-Quellcode

    1. 'Edit new value (other than Category)
    2. Dim NewValue = e.FormattedValue.ToString
    3. Dim ret = VerifyCell(i, j, NewValue) 'NewValue is defined as ByRef
    4. DgvLogRecords.CancelEdit() 'restores previous value
    5. If ret <> "" Then 'ret is the message if not valid
    6. LblMessage.Text = ret
    7. Exit Sub
    8. End If
    9. 'Format Cell - DOES NOT WORK
    10. DgvLogRecords.Item(j, i).Value = NewValue 'New Value is dd.MM.yyyy or "n2"
    jau .... so wie @HenryV das aufzeigt, ist das wohl richtig.

    Ich denke, ich verstehe jetzt, was da passiert:

    In CellValidation Event ist der Edit Mode ja noch nicht zu Ende ... wenn ich da schon die Zelle verändere, dann wird sie einfach im weiteren Verlauf wieder überschrieben! Und damit kommt meine Änderung nicht zum Tragen.

    Ich habe deshalb die Formattierung der Zelle in das EndEdit Event verlagert. Und dann klappt die Sache:

    Diese Technik scheint mir ganz vernünftig zu sein:

    Im CellValidation Event wird die Eingabe geprüft und im Fehlerfall mit CancelEdit() abgebrochen und eine Fehlermeldung zusammen mit der fehlerhaften Eingabe (aus e.FormattedValue) ausgegeben. Dadurch wird die Zelle automatisch restaurriert, was ganz in meinem Sinne ist.

    Wenn Eingabe fehlerfrei ist, dann formattiere ich die Zelle nach meinem Gusto im EndEdit Event. Fertisch.

    Übrigens: sollte das CellValidation Event (je nach Anwendung) nicht durchlaufen werden, wenn man nicht im EditMode ist!

    Dazu merke ich mir den EditMode im Begin EditEvent und prüfe den im CellValidation Event.

    VB.NET-Quellcode

    1. Private Sub DgvLogRecords_CellValidating(sender As Object, e As DataGridViewCellValidatingEventArgs) Handles DgvLogRecords.CellValidating
    2. LblMessage.Text = ""
    3. If Not blnEditMode Then Exit Sub


    Jetzt schnackelt die Routine vortrefflich. Ich hab das mal hier eingestellt, weil das ja auch für andere von Interesse sein könnte ...

    LG
    Peter