Typisiertes DataSet + DGV-Eingabeüberprüfung

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Typisiertes DataSet + DGV-Eingabeüberprüfung

    Hallo,

    ich versuche mich gerade an meinem ersten typisierten DataSet und stehe etwas auf dem Schlauch...

    In einem meiner gebundenen DGVs möchte ich bei Integer-Werten verhindern, dass der Benutzer alle Ziffern aus den Zellen entfernen kann und so die Zelle beim Verlassen leer bleibt (Zeichenanzahl = 0). Wie kann das überhaupt sein? Im DataSet-Designer habe ich festgelegt, dass DBNull-Werte nicht erlaubt sind und die Defaultwerte = 0 festgelegt. Wie kann ich es also anstellen, dass eine leere Zelle im DGV (bzw. in der gebundenen Tabelle) beim Verlassen wieder mit einem Wert gefüllt wird (0 in meinem Fall)? Wenn ich dann während des Debuggens in die entsprechende Tabelle gucke, dann steht da auch tatsächlich nichts in den Zellen... LEER anstatt 0!

    An welcher Stelle sollte man überhaupt die Eingaben ins DGB am Besten überprüfen? Per DGV-Event (z.B. CellValidating) oder greift man besser auf eine Mechanik des typisierten DataSets zurück (über welche ich mir dann nicht bewusst bin)?

    Besten Dank!
    Peterle
    Du willst also einen Input validieren? Da verwende beim DGV das

    ObjectBrowser schrieb:

    Public Event CellValidating(sender As Object, e As System.Windows.Forms.DataGridViewCellValidatingEventArgs)
    Member of System.Windows.Forms.DataGridView

    Summary:
    Occurs when a cell loses input focus, enabling content validation.

    Peterle schrieb:

    dann steht da auch tatsächlich nichts in den Zellen... LEER anstatt 0!
    Der Default-Value kommt da auch nicht zum Einsatz/Tragen. das ist nur z.B. dann relevant, wenn man XML-Daten lädt, bei denen der entsprechende Eintrag fehlt. Dann wird 0 gesetzt.
    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.
    Mit dem CellValidating-Event habe ich es schon probiert:

    VB.NET-Quellcode

    1. Private Sub TemperaturKurvenSegmenteDataGridView1_CellValidating(sender As Object, e As DataGridViewCellValidatingEventArgs) Handles TemperaturKurvenSegmenteDataGridView1.CellValidating
    2. If String.IsNullOrWhiteSpace(CType(e.FormattedValue, String)) Then TemperaturKurvenSegmenteDataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value = 0
    3. End Sub


    ...zwar geht er in den If-Zweig rein, ändert aber den Wert nicht. In meiner DataTable stehen nach wie vor ziffernlose Zellen. Irgendwie muss ich doch in typisierter Manier von dem im DGV-validierten Wert auf die typisierte DataTable schließen können? Schätze ich muss den Wert dann direkt in der Tabelle ändern (oder über die BindingSource?!)?!
    @Peterle Da musste halt debuggen.
    Haltepunkt rein und alles ansehen, was passiert.
    Debuggen, Fehler finden und beseitigen
    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!
    Ja, am besten immer die Daten in der DataTable selbst manipulieren, entweder direkt oder über die BindingSource (dann hast Du da gleich über Current* das korrekte Objekt). Die Manipulation des DGV-Werts geht auch, ist aber über eine zusätzliche Ecke gedacht. Desweiteren hast Du die Folge erlebt: Scheinbar wird der Wert nicht geändert. Aber er wird geändert! Nur nicht sofort angezeigt. Wenn Du die Zelle wieder selektierst, erscheint der (vermeintliche) Defaultwert.

    *Stichwort Doppelcast
    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.
    Ich denke ich habe nun etwas Brauchbares ... danke für die Hinweise!

    VB.NET-Quellcode

    1. Private Sub TemperaturKurvenSegmenteDataGridView1_CellValidating(sender As Object, e As DataGridViewCellValidatingEventArgs) Handles TemperaturKurvenSegmenteDataGridView1.CellValidating
    2. Dim dt = DsMeasurement.TemperaturKurvenSegmente
    3. If e.FormattedValue Is DBNull.Value Or String.IsNullOrWhiteSpace(CType(e.FormattedValue, String)) Then
    4. Dim dr = DirectCast(DirectCast(bsTemperaturKurvenSegmente.Current, DataRowView).Row, TemperaturKurvenSegmenteRow)
    5. Select Case TemperaturKurvenSegmenteDataGridView1.Columns(e.ColumnIndex).DataPropertyName
    6. Case dt.SollTempColumn.ColumnName : dr.SollTemp = 0
    7. Case dt.HeizrateColumn.ColumnName : dr.Heizrate = 0
    8. Case dt.MessintervallColumn.ColumnName : dr.Messintervall = 0
    9. End Select
    10. End If
    11. End Sub

    Möglich. Das CType(e.FormattedValue, String) kannst Du ersetzen durch e.FormattedValue.ToString

    Zwei Hinweise noch: Der Unterschied zwischen And und AndAlso/Or und OrElse
    Und: Um die Verschachtelungstiefe zu verringern, verwende eine If-Umkehrung, also drehe das If logisch um. Dann wird aus

    VB.NET-Quellcode

    1. Private Sub Whatever()
    2. If Bedingung1 AndAlso Bedingung2 OrElse Bedingung3 Then
    3. 'Code
    4. 'Code
    5. 'Code
    6. 'Code
    7. 'Code
    8. End If
    9. End Sub
    ein

    VB.NET-Quellcode

    1. Private Sub Whatever()
    2. If (Not Bedingung1 OrElse Not Bedingung2) AndAlso Not Bedingung3 Then Return
    3. 'Code
    4. 'Code
    5. 'Code
    6. 'Code
    7. 'Code
    8. End Sub
    Verbessert m.E. die Übersicht und verhindert meist mehrfach-verschachtelte If-Statements, bei denen man irgendwann die Übersicht verliert.
    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 1 mal editiert, zuletzt von „VaporiZed“ ()

    Ups - sorry - du willst ja nicht (nur) validieren, sondern den Wert - wenn invalide - korrigieren.
    Dazu verwende das _CellParsing-Event

    VB.NET-Quellcode

    1. Private _ObservedColumn As Integer
    2. Private Sub TemperaturKurvenSegmenteDataGridView1_CellParsing(sender As Object, e As DataGridViewCellParsingEventArgs) Handles TemperaturKurvenSegmenteDataGridView1.CellParsing
    3. If e.ColumnIndex <> _ObservedColumn OrElse e.ParsingApplied Then Return
    4. If Not Integer.TryParse(CStr(e.Value), 0) Then e.Value = 0 : e.ParsingApplied = True
    5. End Sub
    So ungefähr

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