Tipp-Upload: VB.NET 0335: ErrorProvider in DatagridView-Zellen anzeigen
von Spatzenkanonier
Über den Tipp
Dieser Tippvorschlag ist noch unbewertet.
Der Vorschlag ist in den folgenden Kategorien zu finden:
- Datenbanken und XML
- Listensteuerelemente
Dem Tippvorschlag wurden folgende Schlüsselwörter zugeordnet:
IDataErrorInfo,databinding,datagridview,validieren,validierung,errorprovider,validating,bindingsource
Der Vorschlag wurde erstellt am: 26.01.2009 00:30.
Die letzte Aktualisierung erfolgte am 05.02.2009 01:01.
Beschreibung
ADO.Net bietet auch die Möglichkeit der "weichen" Absicherung gegen Fehleingaben. Das bedeutet, invalide Eingaben werden nicht zurückgewiesen (evtl. mit Wurf einer Exception), sondern entgegengenommen, aber als invalide markiert.
Der Programmierer hat Sorge zu tragen, daß solche Datensätze nicht in die Datenbank geschrieben werden.
Außerdem, daß die Fehler auf den Forms sichtbar gemacht werden, und auch, daß die Fehler nicht aus dem Gesichtsfeld geraten (Tabpage wechseln u. dgl.)
Das Datagridview bietet ein hervorragendes Feature zur Visualisierung von Fehleingaben:
In jeder fehlerhaften Zelle wird ein ErrorProvider angezeigt, dessen Tooltip Angaben zur Art der Fehleingabe macht. Im Zeilenkopf wird außerdem ein ErrorProvider angezeigt, mit einer Zusammenfassung aller Fehler des Datensatzes.
Die Überprüfung der Eingaben findet dabei im Datensatz selbst statt, unabhängig vom Form, somit konform mit den Richtlinien zum Aufbau mehrschichtiger Architekturen.
Um mit der "harten" Validierung zu vergleichen brauchen Sie nur einen Buchstaben in ein Zahlen-Feld einzugeben
Schwierigkeitsgrad |
Verwendete API-Aufrufe: |
Download: |
' Dieser Source stammt von http://www.activevb.de ' und kann frei verwendet werden. Für eventuelle Schäden ' wird nicht gehaftet. ' Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum. ' Ansonsten viel Spaß und Erfolg mit diesem Source! ' ' Beachten Sie, das vom Designer generierter Code hier ausgeblendet wird. ' In den Zip-Dateien ist er jedoch zu finden. ' --------- Anfang Projektgruppe IDataErrorInfo.sln --------- ' -------- Anfang Projektdatei IDataErrorInfo.vbproj -------- ' ------------ Anfang Datei frmIDataErrorInfo.vb ------------ ' IDE-Voreinstellungen: ' Option Explicit On ' Option Strict On ' "My Project"-Einstellungen: ' Imports Microsoft.VisualBasic.ControlChars ' Imports System.Windows.Forms Imports System.IO Imports System.ComponentModel Public Class frmIDataErrorInfo ' Anmerkung: Der auf dem Form befindliche datengebundene ErrorProvider "versorgt" nur ' die EinzelControls. Das DatagridView verfügt über eine integrierte ErrorProvider - ' Komponente Public Sub New() InitializeComponent() Me.OrderDB.Customer.AddCustomerRow("Customer0", "?", 0, 1) Me.OrderDB.Customer.AddCustomerRow("Customer1", Nothing, 1, 2) For i As Integer = 2 To 3 Me.OrderDB.Customer.AddCustomerRow("Customer" & i, "1188" & i, i + 3, i + 4) Next End Sub Private Sub frmTestDataErrorInfo_FormClosing( _ ByVal sender As Object, ByVal e As FormClosingEventArgs) Handles Me.FormClosing ' bei Fehler Schließen des Forms verhindern DataValidating(e) End Sub Private Sub SplitContainer1_Panel2_Validating( _ ByVal sender As Object, ByVal e As CancelEventArgs) _ Handles SplitContainer1.Panel2.Validating ' bei Fehler Verlassen des Panels verhindern DataValidating(e) End Sub Private Sub DataValidating(ByVal e As CancelEventArgs) ' Control-Werte in den akt. Datensatz übernehmen Me.CustomerBindingSource.EndEdit() ' dieses cancelt ggfs. die gewünschte Aktion (Close Form bzw. Leave Panel) e.Cancel = Me.OrderDB.HasErrors If e.Cancel Then MessageBox.Show("Nix da!!", "ungültige Daten festgestellt") End Sub Private Sub btApply_Click(ByVal sender As Object, ByVal e As EventArgs) _ Handles btApply.Click Me.CustomerBindingSource.EndEdit() End Sub End Class ' ------------- Ende Datei frmIDataErrorInfo.vb ------------- ' ----------------- Anfang Datei OrderDB.vb ----------------- Imports System.Data Imports System.Text.RegularExpressions Partial Public Class OrderDB ' bei diesen RowActions wird Validität abgeprüft Private Shared _ObservedActions As IList(Of DataRowAction) = New DataRowAction() _ {DataRowAction.Change, DataRowAction.Add} ' die generierte DataTable erweitern Partial Public Class CustomerDataTable Private Shared _PhoneRgx As New Regex("^[0-9 /-]{4,}$|^$", RegexOptions.Compiled) Private Sub CustomerDataTable_RowChanging( _ ByVal sender As Object, ByVal e As DataRowChangeEventArgs) _ Handles Me.RowChanging If Not _ObservedActions.Contains(e.Action) Then Return With DirectCast(e.Row, CustomerRow) If .HasErrors Then .ClearErrors() If .IsCustomerNameNull() Then .SetColumnError("CustomerName", "please input Name!") ElseIf .CustomerName.Length < 4 Then .SetColumnError("CustomerName", "Name too short!") End If If Not .IsCustomerPhoneNull() AndAlso Not _PhoneRgx.IsMatch(.CustomerPhone) Then ' obige Bedingung greift, wenn nichtNull eingegeben wurde, aber der ' Regex scheitert .SetColumnError("CustomerPhone", "Phone not valid!") End If If Not .IsBigNumbNull() AndAlso Not .IsSmallNumbNull() AndAlso .BigNumb <= _ .SmallNumb Then .SetColumnError("SmallNumb", "must be < BigNumb!") .SetColumnError("BigNumb", "must be > SmallNumb!") End If Dim errCount As Integer = .GetColumnsInError().Length If errCount > 0 Then .RowError = "Number of Errors: " & errCount End With End Sub End Class End Class ' ------------------ Ende Datei OrderDB.vb ------------------ ' --------- Ende Projektdatei IDataErrorInfo.vbproj --------- ' ---------- Ende Projektgruppe IDataErrorInfo.sln ----------
Diskussion
Diese Funktion ermöglicht es, Fragen, die die Veröffentlichung des Tipps betreffen, zu klären, oder Anregungen und Verbesserungsvorschläge einzubringen. Nach der Veröffentlichung des Tipps werden diese Beiträge nicht weiter verlinkt. Allgemeine Fragen zum Inhalt sollten daher hier nicht geklärt werden.
Um eine Diskussion eröffnen zu können, müssen sie angemeldet sein.