Die Community zu .NET und Classic VB.
Menü

Tipp-Upload: VB.NET 0335: ErrorProvider in DatagridView-Zellen anzeigen

 von 

Ü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.

Zurück zur Übersicht

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

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

Download:

Download des Beispielprojektes [21,91 KB]

' 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.