vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
NEU! sevCoolbar 3.0 - Professionelle Toolbars im modernen Design!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Re: Abgeleitete Datatable: Constraintverletzung in UNIQUE-Column verhindern 
Autor: Manfred X
Datum: 15.10.13 10:56

Ich hatte vergessen zu erwähnen: Das Phänomen tritt beim
Eintragen von Werten in die Datatable per DatenBindung auf.


Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Abgeleitete Datatable: Constraintverletzung in UNIQUE-Column verhindern 
Autor: Manfred X
Datum: 15.10.13 09:06

Hallo!

Ich möchte in einer Klasse, die von System.Data.Datatable abgeleitet wird,
verhindern, dass auf Zellen von Spalten, für die die einschränkende Eigenschaft
UNIQUE gesetzt ist, Doppel-Werte zugewiesen werden.
(Das Werfen der "ConstraintException" erfolgt erst nach "OnColumnChanged".
Der unzulässige Wert steht dann bereits in der Table.)

Bisheriger Versuch einer "Lösung":
 
Protected Overrides Sub OnColumnChanged _
        (e As System.Data.DataColumnChangeEventArgs)
 
        If e.Column.Unique Then
            'Abbruch, falls Wert in UNIQUE-Spalte vorhanden ist
            If Not IsProposedValueUnique(e) Then Exit Sub
        End If
 
        MyBase.OnColumnChanged(e)
 
        '.............
End Sub
 
Private Function IsProposedValueUnique _
        (ByVal e As DataColumnChangeEventArgs) As Boolean
 
        Dim found As Boolean = False
        Dim rowindex As Integer = -1
        Do
            rowindex += 1
            If e.Row IsNot Me.Rows(rowindex) Then
               found = _
               Me.Rows(rowindex)(e.Column.ColumnName).Equals(e.ProposedValue)
            End If
        Loop While Not found And rowindex < Me.Rows.Count - 1
        Return Not found
 
End Function
Das muß einfacher bzw. eleganter funktionieren.

Beitrag wurde zuletzt am 15.10.13 um 09:06:36 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Abgeleitete Datatable: Constraintverletzung in UNIQUE-Column verhindern 
Autor: Manfred X
Datum: 15.10.13 16:43

Eine "e.Row.EndEdit"-Anweisung zu Beginn des
"ColumnChanged"-Eventhandlers löst bei Datenbindung
die ConstraintException aus.




Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Abgeleitete Datatable: Constraintverletzung in UNIQUE-Column verhindern 
Autor: ErfinderDesRades
Datum: 18.10.13 16:38

"Der unzulässige Wert steht dann bereits in der Table."

glaub ich nicht. Dann hätte die Constraint ja versagt.

Hast du mal den Code, wie du sone Eigenbau-DataTable konfigurierst, und ein DGV dran anbindest? Ich bin zu faul, das zum Testen selbst aufzusetzen.

(Rechtschreibfehler urheberrechtlich geschützt)

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Abgeleitete Datatable: Constraintverletzung in UNIQUE-Column verhindern 
Autor: Manfred X
Datum: 18.10.13 17:41


Du zweifelst ????

Die Constraint versagt nicht, sondern beim Eintragen
von Werten durch die Datenbindung (Datarow.BeginEdit) ist die Anwendung
der Validierungsregeln ausser Kraft gesetzt - bis für
die Zeile EndEdit gerufen wird.
Die Werte werden währenddessen eingetragen (Current) und die
entsprechenden Column-Events der Table feuern.
Mein Problem: Diese On-Events füllen meine UNDO-Liste.
Ich muß deshalb die Validierungsregeln per Code prüfen,
damit dort keine unsinnigen Werte landen - oder durch
EndEdit im OnColumnChange-Event die Validierung erzwingen.

Wenn jemand einen besseren Vorschlag hat ...








Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Abgeleitete Datatable: Constraintverletzung in UNIQUE-Column verhindern 
Autor: ErfinderDesRades
Datum: 18.10.13 18:24

jo, hast recht.
ich zweifelte, weil wenn ich im DGV ungültige Werte eingebe, dann gibts die DGVException-Messagebox, und wenn man die wegklickt, ist die Fehleingabe auch wieder aus dem DGV entfernt.

Aber für dein Prob habich vlt. eine annere Lösung:
   Partial Class DataTable1DataTable
 
      Private Sub DataTable1DataTable_DataTable1RowChanging(sender As _
        System.Object, e As DataTable1RowChangeEvent) Handles _
        Me.DataTable1RowChanging
         If e.Action = DataRowAction.Commit Then
            Dbg("commit")
         End If
      End Sub
 
   End Class
also im RowChanging sich e.Action angucken, und nur bei Commit in die UndoListe übernehmen.
Das Commit kommt nicht, wenn das DGV eine Fehleingabe ablehnt.

(Rechtschreibfehler urheberrechtlich geschützt)

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Abgeleitete Datatable: Constraintverletzung in UNIQUE-Column verhindern 
Autor: Manfred X
Datum: 18.10.13 18:39


Ja. Bei der Überlegung war ich auch gelandet.

Allerdings bin ich noch nicht dazu gekommen, zu untersuchen,
ob diese Commit-Action meine Funktion (REDO/UNDO für ZELLEN)
anderweitig stört.

Was mache ich z.B. wenn mehrere Werte in einer
Zeile geändert werden und ein UNDO wird vom Benutzer
bereits angefordert, ehe ein Commit für die Row gegeben wurde ?

Vorerst checke ich die Validierung deshalb per Code.



Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel