Procedura dettagliata: Gestione degli errori che si verificano durante l'immissione di dati nel controllo DataGridView di Windows Forms

La gestione degli errori dall'archivio dati sottostante è una funzionalità necessaria per un'applicazione di immissione dati. Il controllo Windows Forms semplifica questa operazione esponendo l'evento , che viene generato quando l'archivio dati rileva una violazione di vincolo o DataGridView DataError una regola business interrotta.

In questa procedura dettagliata verranno recuperate righe dalla tabella Customers del database di esempio Northwind e visualizzate in un controllo DataGridView . Quando viene rilevato un valore duplicato in una nuova riga o in una riga esistente modificata, si verificherà l'evento , che verrà gestito visualizzando un oggetto che descrive CustomerID DataError MessageBox l'eccezione.

Per copiare il codice in questo argomento come singolo listato, vedere Procedura: Gestire gli errori che si verificano durante l'immissione di dati nel controllo DataGridView Windows Form.

Prerequisiti

Per completare questo scenario, saranno necessari gli elementi seguenti:

  • Accesso a un server con il database di SQL Server Northwind.

Creazione del form

Per gestire gli errori di immissione dati nel controllo DataGridView

  1. Creare una classe che deriva da Form e contiene un controllo e un DataGridView BindingSource componente.

    L'esempio di codice seguente fornisce l'inizializzazione di base e include un Main metodo .

    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. Implementare un metodo nella definizione di classe del form per gestire i dettagli della connessione al database.

    In questo esempio di codice viene GetData utilizzato un metodo che restituisce un oggetto DataTable popolato. Assicurarsi di impostare la connectionString variabile su un valore appropriato per il database.

    Importante

    L'archiviazione delle informazioni riservate, ad esempio la password, nella stringa di connessione può avere implicazioni sulla sicurezza dell'applicazione. L'autenticazione di Windows, detta anche sicurezza integrata, consente di controllare l'accesso a un database in modo più sicuro. Per altre informazioni, vedere Protezione delle informazioni di connessione.

    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. Implementare un gestore per l'evento del form Load che inizializza e e configura il DataGridView BindingSource data binding.

    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. Gestire DataError l'evento nell'oggetto DataGridView .

    Se il contesto dell'errore è un'operazione di commit, visualizzare l'errore in un MessageBox oggetto .

    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
    

Test dell'applicazione

È ora possibile testare il modulo per assicurarsi che si comporti come previsto.

Per testare il modulo

  • Premere F5 per eseguire l'applicazione.

    Verrà visualizzato un DataGridView controllo con i dati della tabella Customers. Se si immette un valore duplicato per e si esegue il commit della modifica, il valore della cella verrà ripristinato automaticamente e verrà visualizzato un errore di CustomerID MessageBox immissione dati.

Passaggi successivi

Questa applicazione offre una conoscenza di base delle DataGridView funzionalità del controllo. È possibile personalizzare l'aspetto e il comportamento del DataGridView controllo in diversi modi:

Vedi anche