Problem DataGridView.CellValidating event

  • VB.NET
  • .NET 4.0

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

    Problem DataGridView.CellValidating event

    Habe ein Problem mit DataGridview.CellValidating. Wenn ich bei falscher Eingabe den Focus auf eine andere Zelle oder ein anderes Control setze, wird das Event abgearbeitet. Beim Betätigen des Close buttons (X) wird es einfach übersprungen. Das heißt der falsche Wert bleibt erhalten und bereitet später Schwierigkeiten. Wie lässt sich das vermeiden?

    Es handelt sich übrigens um ein ungebundenes DGV.

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

    drschef schrieb:

    Beim Betätigen des Close buttons (X) wird es einfach übersprungen. Das heißt der falsche Wert bleibt erhalten und bereitet später Schwierigkeiten.
    Das sollte eiglich nicht sein.
    Wie äussern sich die Schwierigkeiten, und könnemer den Code sehen, wenn die Schwierigkeiten sich äussern? (Fehlerzeile, Fehlermeldung etc. - kennste ja)
    Habe auf Empfehlung auf die erwähnte Seite geschaut. Hat mir aber nicht viel gebracht.

    Ich sehe zumidest keinen grundsätzlichen Unterschied zu meinem Code:

    VB.NET-Quellcode

    1. Private Sub Grid_CellValidating(sender As Object, e As System.Windows.Forms.DataGridViewCellValidatingEventArgs) Handles Grid.CellValidating
    2. If ladenok Then
    3. If e.ColumnIndex = 0 Then
    4. Dim wert As String = e.FormattedValue.ToString
    5. If wert.Substring(0, 1) <> "." Then
    6. MessageBox.Show("Der Dateityp (" & wert & ") muss mit einem Punkt beginnen!")
    7. End If
    8. End If
    9. End If
    10. End Sub


    Das Problem liegt ja nicht darin, dass er den Fehler nicht erkennt, sondern dass er die Prüfung bei Betätigung des X-Buttons gar nicht durchführt.
    Dann arbeitet das Programm mit falschen (Parameter-)Werten weiter. Eine Prüfug ist ja dazu da, dass sie Probleme verhindert. Das Grid enthält eine Auflistung von Dateitypen. Wenn die syntaktisch nicht richtig eingetragen sind, da kann in der Folge natürlich einiges schiefgehen.
    Ich hatte Sendepause, weil ich den Code erstmal auf das Notwendigste reduzieren wollte, um den Fehler besser einzugrenzen. Das hat eine Erkenntnis gebracht: Plötzlich wurde die Prüfung auch beim X-Close durchgeführt. Der Unterschied: Bei Form.Show läuft Grid.CellValidating, bei Form.ShowDialog nicht. Merkwürdig! Oder bin ich zu doof?

    Den Code kammer schon sehen. Wie soll ich die Quelle verfügbar machen? Ich bin da ein wenig ungelenk.
    Du könntest den bitten, der für dich post#4 eingestellt hat, dir nochmal zu helfen.
    Weil vom Code einstellen her ist post#4 eiglich garnetmal so ungelungen - es ist nur grad die Stelle, wo das Problem ja nicht auftritt.

    Aber dass du .ShowDialog verwendest ist evtl. bereits Information genug, und richtig: bei ShowDialog wird beim Closen nicht automatisch validiert.
    Daher werfe ich mal die Form.ValidateChildren() - Function in den Raum - guck sie dir mal im Objectbrowser an.

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

    Ich habe die Prüfung aus der Einzelzelle heraus genommen und im Form.Closing event eine For-Schleife für alle Zeilen mit Prüfung vorgesehen. Dabei stellte sich heraus, dass noch nicht einmal das Editieren eines Wertes beim x-Close abgeschlossen wird, obwohl das Grid den editierten Inhalt zeigt. U.a. nach dem Löschen eines Zellinhalts zeigt ein Protokoll beim Close noch den alten Inhalt an. Es handelt sich um ein ungebundenes DataGridView. Wie lässt sich der Editiervorgang sicher abschließen, außer mit dem Wechsel zu einer anderen Zelle?

    VB.NET-Quellcode

    1. Private Sub Grafiktypen_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    2. B_Neu.Focus()
    3. For i As Integer = 0 To Grid.Rows.Count - 1
    4. If Grid.Rows(i).Cells(0).Value Is Nothing Then
    5. MessageBox.Show("Es ist kein Dateityp eingetragen")
    6. e.Cancel = True
    7. Exit Sub
    8. End If
    9. Next
    10. End Sub


    In diesem Fall kann noch der gerade gelöschte Wert als Inhalt ausgelesen werden und es wird kein Fehler protokolliert
    Danke Erfinder des Rades!

    Ich hatte schon ein wenig mit BeginnEdit und EndEdit gespielt, allerdings an der falschen Stelle. Jetzt habe ich es in den Close eingebaut und das brachte den Erfolg:

    VB.NET-Quellcode

    1. Private Sub Grafiktypen_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    2. Grid.EndEdit()
    3. For i As Integer = 0 To Grid.Rows.Count - 1
    4. Dim j = i + 1
    5. If Grid.Rows(i).Cells(0).Value Is Nothing Then
    6. MessageBox.Show("In Zeile " & j & " ist kein Dateityp eingetragen")
    7. e.Cancel = True
    8. Exit Sub
    9. End If
    10. If Grid.Rows(i).Cells(0).Value.ToString.Trim = "" Then
    11. MessageBox.Show("In Zeile " & j & " fehlt Dateityp")
    12. e.Cancel = True
    13. Exit Sub
    14. End If
    15. Dim w As String = Grid.Rows(i).Cells(0).Value.ToString
    16. If w.Length < 3 Then
    17. MessageBox.Show("Der Dateityp " & w & " hat nicht die erforderliche Länge")
    18. e.Cancel = True
    19. End If
    20. If w.Substring(0, 1) <> "." Then
    21. MessageBox.Show("Der Dateityp '" & w & "' muss mit einem Punkt beginnen!")
    22. e.Cancel = True
    23. End If
    24. Next
    25. End Sub


    Auch mit der Empfehlung Form.ValidateChildren() habe ich mich einige Zeit befasst. Allerdings hatte das den Anschein, sich zu einem Forschungsthema zu entwickeln. Dann habe ich es doch abgebrochen. Mir scheint das Problem trotzdem hinreichend gelöst

    drschef schrieb:

    Auch mit der Empfehlung Form.ValidateChildren() habe ich mich einige Zeit befasst. Allerdings hatte das den Anschein, sich zu einem Forschungsthema zu entwickeln.
    Ja, natürlich!
    Forschungsthemen sind die allerwertvollsten - weil daran lernt man was.
    ZB täte es mich interessieren, obs dir ühaupt gelungen ist, .ValidateChildren() mal im ObjectBrowser anzugugge.
    ​täte es mich interessieren, obs dir ühaupt gelungen ist, .ValidateChildren() mal im ObjectBrowser anzugugge.


    Ist mir schon, aber dort findet man ja nur eine formale Beschreibung. Dann habe ich im Web gesucht und u.a. folglendes Beispiel gefunden:

    msdn.microsoft.com/de-de/library/ms158374(v=vs.110).aspx

    Dieses habe ich versucht nachzubilden, aber irgendwie habe ich es nicht zum Laufen gebracht.