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

La gestione degli errori dall'archivio dati sottostante è una funzionalità necessaria per un'applicazione di immissione dati. Il controllo Windows Form DataGridView semplifica l'esposizione dell'evento, generato quando l'archivio DataError dati rileva una violazione del vincolo o una regola business interrotta.

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

Per copiare il codice in questo argomento come singolo elenco, 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 esempio Northwind SQL Server.

Creazione del form

Per gestire gli errori di immissione dei dati nel controllo DataGridView

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

    Nell'esempio di codice seguente viene fornita l'inizializzazione di base e viene incluso 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 della classe del modulo per gestire i dettagli della connessione al database.

    In questo esempio di codice viene utilizzato un GetData metodo che restituisce un oggetto popolato DataTable . 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 Load modulo che inizializza DataGridView e BindingSource imposta il 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 l'evento DataError in DataGridView.

    Se il contesto per l'errore è un'operazione di commit, visualizzare l'errore in un oggetto 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
    

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 compilato con i dati della tabella Customers. Se si immette un valore duplicato per CustomerID e si esegue il commit della modifica, il valore della cella verrà ripristinato automaticamente e verrà visualizzato un MessageBox che visualizza l'errore di immissione dei 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