Exemplarische Vorgehensweise: Behandeln von Fehlern, die während der Dateneingabe im DataGridView-Steuerelement in Windows Forms auftreten

Die Behandlung von Fehlern aus dem zugrunde liegenden Datenspeicher ist eine notwendige Funktion für eine Anwendung zur Dateneingabe. Das Windows Forms-Steuerelement DataGridView erleichtert diese Aufgabe, indem es das Ereignis DataError zur Verfügung stellt. Dieses Ereignis wird ausgelöst, wenn der Datenspeicher eine Einschränkungsverletzung oder einen Verstoß gegen eine Geschäftsregel feststellt.

In dieser exemplarischen Vorgehensweise werden Sie Zeilen aus der Tabelle Customers in der Northwind-Beispieldatenbank abrufen und in einem DataGridView-Steuerelement anzeigen. Wenn ein doppelter CustomerID-Wert in einer neuen oder bearbeiteten Zeile erkannt wird, wird das Ereignis DataError ausgelöst, das durch die Anzeige einer MessageBox mit der Beschreibung der Ausnahme behandelt wird.

Wenn Sie den Code in diesem Thema als einzelnes Listing kopieren möchten, lesen Sie Vorgehensweise: Behandeln von Fehlern, die während der Dateneingabe im DataGridView-Steuerelement in Windows Forms auftreten.

Voraussetzungen

Für die Durchführung dieser exemplarischen Vorgehensweise benötigen Sie Folgendes:

  • Zugriff auf einen Server mit der SQL Server-Beispieldatenbank „Northwind“.

Erstellen des Formulars

So behandeln Sie Dateneingabefehler im DataGridView-Steuerelement

  1. Erstellen Sie eine Klasse, die von Form abgeleitet ist und ein DataGridView-Steuerelement sowie eine BindingSource-Komponente enthält.

    Das folgende Codebeispiel bietet eine grundlegende Initialisierung und umfasst eine Main-Methode.

    using System;
    using System.Data;
    using System.Data.SqlClient;
    using System.Windows.Forms;
    
    public class Form1 : System.Windows.Forms.Form
    {
        private DataGridView dataGridView1 = new DataGridView();
        private BindingSource bindingSource1 = new BindingSource();
    
        public Form1()
        {
            // Initialize the form.
            this.dataGridView1.Dock = DockStyle.Fill;
            this.Controls.Add(dataGridView1);
            this.Load += new EventHandler(Form1_Load);
        }
    
    Imports System.Data
    Imports System.Data.SqlClient
    Imports System.Windows.Forms
    
    Public Class Form1
        Inherits System.Windows.Forms.Form
    
        Private WithEvents dataGridView1 As New DataGridView()
        Private bindingSource1 As New BindingSource()
    
        Public Sub New()
    
            ' Initialize the form.
            Me.dataGridView1.Dock = DockStyle.Fill
            Me.Controls.Add(dataGridView1)
    
        End Sub
    
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.Run(new Form1());
        }
    }
    
        <STAThread()> _
        Shared Sub Main()
            Application.EnableVisualStyles()
            Application.Run(New Form1())
        End Sub
    
    End Class
    
  2. Implementieren Sie eine Methode in der Klassendefinition Ihres Formulars, um die Details der Verbindung mit der Datenbank zu verarbeiten.

    In diesem Codebeispiel wird eine GetData-Methode verwendet, die ein aufgefülltes DataTable-Objekt zurückgibt. Sorgen Sie dafür, dass die connectionString-Variable auf einen Wert festgelegt wird, der für Ihre Datenbank geeignet ist.

    Wichtig

    Das Speichern vertraulicher Informationen (z. B. eines Kennworts) innerhalb der Verbindungszeichenfolge kann die Sicherheit einer Anwendung beeinträchtigen. Der Zugriff auf eine Datenbank lässt sich mithilfe der Windows-Authentifizierung (wird auch als integrierte Sicherheit bezeichnet) sicherer steuern. Weitere Informationen finden Sie unter Protecting Connection Information (Schützen von Verbindungsinformationen).

    private static DataTable GetData(string selectCommand)
    {
        string connectionString =
            "Integrated Security=SSPI;Persist Security Info=False;" +
            "Initial Catalog=Northwind;Data Source=localhost;Packet Size=4096";
    
        // Connect to the database and fill a data table, including the
        // schema information that contains the CustomerID column
        // constraint.
        SqlDataAdapter adapter =
            new SqlDataAdapter(selectCommand, connectionString);
        DataTable data = new DataTable();
        data.Locale = System.Globalization.CultureInfo.InvariantCulture;
        adapter.Fill(data);
        adapter.FillSchema(data, SchemaType.Source);
    
        return data;
    }
    
    Private Shared Function GetData(ByVal selectCommand As String) As DataTable
    
        Dim connectionString As String = _
            "Integrated Security=SSPI;Persist Security Info=False;" + _
            "Initial Catalog=Northwind;Data Source=localhost;Packet Size=4096"
    
        ' Connect to the database and fill a data table, including the 
        ' schema information that contains the CustomerID column 
        ' constraint.
        Dim adapter As New SqlDataAdapter(selectCommand, connectionString)
        Dim data As New DataTable()
        data.Locale = System.Globalization.CultureInfo.InvariantCulture
        adapter.Fill(data)
        adapter.FillSchema(data, SchemaType.Source)
    
        Return data
    
    End Function
    
  3. Implementieren Sie einen Handler für das Load-Ereignis Ihres Formulars, das die DataGridView und die BindingSource initialisiert und die Datenbindung einrichtet.

    private void Form1_Load(System.Object sender, System.EventArgs e)
    {
        // Attach the DataError event to the corresponding event handler.
        this.dataGridView1.DataError +=
            new DataGridViewDataErrorEventHandler(dataGridView1_DataError);
    
        // Initialize the BindingSource and bind the DataGridView to it.
        bindingSource1.DataSource = GetData("select * from Customers");
        this.dataGridView1.DataSource = bindingSource1;
        this.dataGridView1.AutoResizeColumns(
            DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader);
    }
    
    Private Sub Form1_Load(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles Me.Load
    
        ' Initialize the BindingSource and bind the DataGridView to it.
        bindingSource1.DataSource = GetData("select * from Customers")
        Me.dataGridView1.DataSource = bindingSource1
        Me.dataGridView1.AutoResizeColumns( _
            DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader)
    
    End Sub
    
  4. Behandeln Sie das DataError-Ereignis für die DataGridView.

    Wenn der Fehlerkontext ein Commitvorgang ist, zeigen Sie den Fehler in einer MessageBox an.

    private void dataGridView1_DataError(object sender,
        DataGridViewDataErrorEventArgs e)
    {
        // If the data source raises an exception when a cell value is
        // commited, display an error message.
        if (e.Exception != null &&
            e.Context == DataGridViewDataErrorContexts.Commit)
        {
            MessageBox.Show("CustomerID value must be unique.");
        }
    }
    
    Private Sub dataGridView1_DataError(ByVal sender As Object, _
        ByVal e As DataGridViewDataErrorEventArgs) _
        Handles dataGridView1.DataError
    
        ' If the data source raises an exception when a cell value is 
        ' commited, display an error message.
        If e.Exception IsNot Nothing AndAlso _
            e.Context = DataGridViewDataErrorContexts.Commit Then
    
            MessageBox.Show("CustomerID value must be unique.")
    
        End If
    
    End Sub
    

Testen der Anwendung

Sie können das Formular jetzt testen, um sicherzustellen, dass das Verhalten wie erwartet ausfällt.

So testen Sie das Formular

  • Drücken Sie F5, um die Anwendung auszuführen.

    Es wird ein DataGridView-Steuerelement angezeigt, das mit Daten aus der Kundentabelle gefüllt ist. Wenn Sie einen doppelten Wert für CustomerID eingeben und die Bearbeitung committen, wird der Wert der Zelle automatisch zurückgesetzt, und Sie sehen eine MessageBox, die den Dateneingabefehler anzeigt.

Nächste Schritte

Diese Anwendung vermittelt Ihnen ein grundlegendes Verständnis der Funktionen des DataGridView-Steuerelements. Sie können das Aussehen und Verhalten des DataGridView -Steuerelements auf verschiedene Weise anpassen:

Weitere Informationen