Delen via


Handleiding: Omgaan met fouten die optreden tijdens het invoeren van gegevens in de Windows Forms DataGridView-besturingselement

Het verwerken van fouten uit het onderliggende gegevensarchief is een vereiste functie voor een toepassing voor gegevensinvoer. Het Windows Forms DataGridView-besturingselement maakt dit eenvoudig door de DataError-gebeurtenis bloot te leggen, die wordt gegenereerd wanneer een beperkingsinbreuk of een verbroken bedrijfsregel in de datastore wordt gedetecteerd.

In deze handleiding haalt u rijen op uit de tabel Customers in de voorbeelddatabase Northwind en geeft u deze weer in een controle-element DataGridView. Wanneer een dubbele CustomerID waarde wordt gedetecteerd in een nieuwe rij of een bewerkte bestaande rij, vindt de DataError gebeurtenis plaats, die wordt verwerkt door een MessageBox weer te geven waarin de uitzondering wordt beschreven.

Als u de code in dit onderwerp als één enkele lijst wilt kopiëren, zie Hoe: Fouten afhandelen die optreden tijdens het invoeren van gegevens in het besturingselement Windows Forms DataGridView.

Vereiste voorwaarden

Als u deze procedure wilt voltooien, hebt u het volgende nodig:

  • Toegang tot een server met de voorbeelddatabase Northwind SQL Server.

Het formulier maken

Gegevensinvoerfouten afhandelen in het DataGridView-besturingselement

  1. Maak een klasse die is afgeleid van Form en bevat een DataGridView besturingselement en een BindingSource-onderdeel.

    Het volgende codevoorbeeld biedt eenvoudige initialisatie en bevat een 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. Implementeer een methode in de klassedefinitie van uw formulier voor het verwerken van de details van het maken van verbinding met de database.

    In dit codevoorbeeld wordt een GetData methode gebruikt waarmee een ingevuld DataTable-object wordt geretourneerd. Zorg ervoor dat u de connectionString variabele instelt op een waarde die geschikt is voor uw database.

    Belangrijk

    Het opslaan van gevoelige informatie, zoals een wachtwoord, binnen de verbindingsreeks kan van invloed zijn op de beveiliging van uw toepassing. Het gebruik van Windows-verificatie (ook wel geïntegreerde beveiliging genoemd) is een veiligere manier om de toegang tot een database te beheren. Zie Verbindingsinformatie beveiligenvoor meer informatie.

    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. Implementeer een handler voor de Load gebeurtenis van uw formulier waarmee de DataGridView en BindingSource worden geïnitialiseerd en de gegevensbinding wordt ingesteld.

    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. Behandel de DataError-gebeurtenis op de DataGridView.

    Als de context voor de fout een doorvoeringsbewerking is, geeft u de fout weer in een MessageBox.

    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
    

De toepassing testen

U kunt het formulier nu testen om ervoor te zorgen dat het zich gedraagt zoals verwacht.

Om het formulier te testen

  • Druk op F5 om de toepassing uit te voeren.

    U ziet een DataGridView besturingselement dat is gevuld met gegevens uit de tabel Klanten. Als u een dubbele waarde invoert voor CustomerID en de bewerking doorvoert, wordt de celwaarde automatisch teruggezet en ziet u een MessageBox waarin de fout bij het invoeren van gegevens wordt weergegeven.

Volgende stappen

Deze toepassing biedt u een basiskennis van de mogelijkheden van het DataGridView besturingselement. U kunt het uiterlijk en gedrag van het besturingselement DataGridView op verschillende manieren aanpassen:

Zie ook