Suche passendes DatagridView-Event

  • VB.NET

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

    Suche passendes DatagridView-Event

    Hallo liebe Gemeinde,
    ich habe folgende Ausgangssituation:
    1 typisiertes Dataset mit 2 Tabellen und Beziehungen
    1 Form mit TabpageControl. Auf dessen Page 1 ist ein DGV mit Tabelle1, Auf Page 2 Ist ein DGV mit Tabelle2 (Tabelle 1 und 2 sind über eine 1:n miteinander verknüpft)

    Nun gibt es in Tabelle 1 ein Feld, in dem nach Erstellen eines Datensatzes in Tabelle 2 die ID der Tabelle2 eingetragen wird. Damit habe ich in Tabelle1 immer einen Verweis auf den letzten zugehörigen Datensatz in Tabelle2. Dieses Feld in DGV1 ist als ComboboxColumn erstellt und zeigt damit ein Datumsfeld aus Tabelle2 an. Wird nun zunächst in Tabelle1 ein Datensatz erstellt, gibt es keinen dazugehörigen Satz in Tabelle2. Damit wird das DataError-Event des DGV gefeuert, in dem ich einen Errortext in die Zelle schreibe.
    Wird in Tabelle2 (auf TabPage2) ein Datensatz erstellt, wird dessen ID in Tabelle1 eingetragen. Beim Zurückgehen auf DGV1 sieht man auch sofort den eingetragenen Wert. Nun kann ja auch der Errortext wieder raus. Ich finde jedoch kein Event, dass beim Eintragen des Wertes in DGV1 aufgerufen wird. Es gibt zwar in der dataset.Tabelle ein Rowchanged, dass mir aber nicht die DGV-RowIndex geben kann.
    Ich hab mich jetzt des DGV-Prepaint-Events bedient, was auch funzt. Mich dünkt aber, dasses da noch was anners geben müsste.

    Wenn die Beschreibung zu kryptisch ist, gebt bitte Bescheid :)

    Fielen dank schonma

    Vatter
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:

    Vatter schrieb:

    Wenn die Beschreibung zu kryptisch ist, gebt bitte Bescheid
    Bescheid!

    Also ich hab bestimmt nicht richtig kapiert - ist die 1:n von Tabelle1->Tabelle2 oder annersrum?
    Dieses Eintragen der ID - codeseitig, oder?
    Und dann verweisen alle Combos aus Tab1 auf denselben Datensatz von Tab2? (wie war nochma die Relation - Tab1->Tab2 oder annersrum?)
    Und wenn ein neuer Tab1 erzeugt wird - kann man dem nicht gleich einen Tab2 überordnen, und also ohne den Error auskommen?
    Wie bringst du einen Error-Text in die Zelle, das täte michmal interessieren?

    Ach, oder mach dochmaln Sample zum Fehlverhalten reproduzieren.

    Edit: das mit dem Errortext habichjetzt auch gefunden - kannte ich noch garnet, thx!

    Aber was besseres als RowPrepaint hab ich auch nicht gefunden, jdfs dasser über Databinding oder sonstwie automatisch erkennt, wann der Errortext wieder weg kann.

    Muss vmtl. ebenso händisch weggemacht wern, wie er gesetzt wurde.
    Vlt. kannsteja den Punkt rauskriegen, welche Änderung an den Daten den Fehler behebt, und da einfach BruteForce-mäßig alle DGV-Zellen abklappern, und ErrorText löschen, wenn vorhanden. Nicht elegant, aber sind kaum jemals über 150 Zyklen, und wennde nur die Spalte abklpperst, sinds vlt. 20 Zyklen, und dann können theoretisch Fehler in anneren Spalten sogar noch angezeigt bleiben.

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

    Naja, im Grunde isses recht einfach:
    Wenn ich den Datensatz in Tab2 erstelle, hole ich mir über die Bindingsource den übergeordneten Satz aus Tab1. In den trage ich denn die ID des neuen Satzes ein. Genau in diesem Moment wäre ein Event ideal. Ich werds ma mit BindingSource.CurrentItemChanged-Ereignis testen.
    Ansonsten lassich des so mit Paint. Da kriegich über e.Rowindex immer die betreffende Zeile. Und neue Zahl heißt ja auch neu zeichnen.

    Edit:
    Das mit den Beziehungen kommt aus diesem Thread und es geht um die für "letzte Prüfung" (Hab des Thema mal wieder angegriffen).
    Und des DatagridErrordingens, was dich noch verwunderte, kam mir da sogar gelegen, weil ein dickes rotes Ausrufezeichen (wie bei Errorprovider) dem User anzeigt, dasser das Gerät noch prüfen muß. Liegen tuts dadran, dass die Combobox ja über Datavalue (Was ja denn DBNull is) ganz verzeifelt nach dem Datamember in der Tabelle2 suchen tut.
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:

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

    Man kann es so lösen:

    An geeigneter Stelle, z.B. Form_Load-Event:

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    2. ' Aktiviert das Event
    3. AddHandler Me.MeinDataset.Tables(Me.MeinDataset.MeineTabelle.TableName).ColumnChanging, AddressOf MeineTabelle_ColumnChanging
    4. End Sub


    Dann die Behandlungsroutine:

    VB.NET-Quellcode

    1. Private Sub MeineTabelle_ColumnChanging(ByVal sender As Object, ByVal e As System.Data.DataColumnChangeEventArgs)
    2. ' Fehler der aktuellen Zeile löschen.
    3. e.Row.ClearErrors()
    4. ' Nur auf Fehler in der Spalte [MeineSpalte] prüfen
    5. If e.Column.Equals(Me.MeinDataSet.MeineTabelle.MeineSpalteColumn) Then
    6. ' Mögliche Fehler des Eingabewertes untersuchen.
    7. Select Case True
    8. Case e.ProposedValue < 0 OrElse e.ProposedValue > 100
    9. Dim badValue As Object = e.ProposedValue
    10. e.Row.RowError = "Der eingegebene Wert ist ungültig."
    11. e.Row.SetColumnError(e.Column, String.Format("Der eingegebene Wert muss zwischen 0 und 100 liegen. Die Eingabe von {0}% ist ungültig.", badValue))
    12. Case ...
    13. ' Weitere Bedingungen.
    14. End Select
    15. End If
    16. End Sub