| |
VB.NET - Ein- und UmsteigerRe: 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.
| |
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. | |
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.
| |
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) | |
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 ...
| |
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) | |
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.
| |
| 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 |
|
|
vb@rchiv CD Vol.6 vb@rchiv Vol.6
Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
Online-Update-Funktion Entwickler-Vollversionen u.v.m.Jetzt zugreifen Tipp des Monats Neu! sevCoolbar 3.0
Professionelle Toolbars im modernen Design!
Mit sevCoolbar erstellen Sie in wenigen Minuten ansprechende und moderne Toolbars und passen diese optimal an das Layout Ihrer Anwendung an (inkl. große Symbolbibliothek) - für VB und MS-Access Weitere Infos
|
|
|
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
|
|