Condividi tramite


Procedura dettagliata: convalida di dati nel controllo DataGridView Windows Form

Aggiornamento: novembre 2007

Quando la funzionalità di immissione dei dati viene resa disponibile agli utenti, è necessario che i dati immessi nel form vengano convalidati frequentemente. La classe DataGridView consente di eseguire agevolmente la convalida prima del commit dei dati nell'archivio dati. È possibile convalidare i dati gestendo l'evento CellValidating, generato dalla classe DataGridView al variare della cella corrente.

In questa procedura dettagliata verranno recuperate righe dalla tabella Customers del database di esempio Northwind e verranno visualizzate in un controllo DataGridView. Quando un utente modifica una cella nella colonna CompanyName e prova a lasciare la cella, il gestore eventi CellValidating esaminerà la nuova stringa del nome della società per accertarsi che non sia vuota. Se il nuovo valore è una stringa vuota, la classe DataGridView impedirà al cursore dell'utente di lasciare la cella senza prima avere immesso una stringa non vuota.

Per copiare il codice nell'argomento corrente come un elenco singolo, vedere Procedura: convalidare dati nel controllo DataGridView di Windows Form.

Prerequisiti

Per completare questa procedura dettagliata, è necessario disporre dei seguenti elementi:

  • Accesso a un server che dispone del database di esempio di SQL Server, Northwind.

Creazione del form

Per convalidare i dati immessi in una classe DataGridView

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

    L'esempio di codice riportato di seguito fornisce l'inizializzazione di base del form e include un metodo Main.

    Imports System
    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)
            Me.Text = "DataGridView validation demo (disallows empty CompanyName)"
    
        End Sub
    
    
    ...
    
    
        <STAThread()> _
        Shared Sub Main()
            Application.EnableVisualStyles()
            Application.Run(New Form1())
        End Sub
    
    End Class
    
    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);
            this.Text = "DataGridView validation demo (disallows empty CompanyName)";
        }
    
    
    ...
    
    
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.Run(new Form1());
        }
    
    }
    
  2. Implementare un metodo nella definizione di classe del form per la gestione dei dettagli della connessione al database.

    In questo esempio di codice viene utilizzato un metodo GetData che restituisce un oggetto DataTable popolato. Accertarsi di avere impostato la variabile connectionString su un valore appropriato per il database in uso.

    Nota sulla sicurezza:

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

    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.
        Dim adapter As New SqlDataAdapter(selectCommand, connectionString)
        Dim data As New DataTable()
        data.Locale = System.Globalization.CultureInfo.InvariantCulture
        adapter.Fill(data)
    
        Return data
    
    End Function
    
    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.
        SqlDataAdapter adapter =
            new SqlDataAdapter(selectCommand, connectionString);
        DataTable data = new DataTable();
        data.Locale = System.Globalization.CultureInfo.InvariantCulture;
        adapter.Fill(data);
    
        return data;
    }
    
  3. Implementare un gestore per l'evento Load del form che inizializza le classi DataGridView e BindingSource e configura l'associazione dei dati.

    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
    
    private void Form1_Load(System.Object sender, System.EventArgs e)
    {
        // Attach DataGridView events to the corresponding event handlers.
        this.dataGridView1.CellValidating += new
            DataGridViewCellValidatingEventHandler(dataGridView1_CellValidating);
        this.dataGridView1.CellEndEdit += new
            DataGridViewCellEventHandler(dataGridView1_CellEndEdit);
    
        // Initialize the BindingSource and bind the DataGridView to it.
        bindingSource1.DataSource = GetData("select * from Customers");
        this.dataGridView1.DataSource = bindingSource1;
        this.dataGridView1.AutoResizeColumns(
            DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader);
    }
    
  4. Implementare i gestori per gli eventi CellValidating e CellEndEdit del controllo DataGridView.

    Il gestore eventi CellValidating è l'elemento che consente di determinare se il valore di una cella nella colonna CompanyName è vuoto. Se il valore della cella non supera la convalida, impostare la proprietà Cancel della classe System.Windows.Forms.DataGridViewCellValidatingEventArgs su true. In questo modo, il controllo DataGridView impedirà al cursore di lasciare la cella. Impostare la proprietà ErrorText della riga su una stringa descrittiva. Verrà visualizzata un'icona di errore con una descrizione comandi contenente il testo dell'errore. Nel gestore eventi CellEndEdit, impostare la proprietà ErrorText della riga sulla stringa vuota. L'evento CellEndEdit si verifica solo quando la cella esce dalla modalità di modifica. Ciò non avviene se la convalida non è riuscita.

    Private Sub dataGridView1_CellValidating(ByVal sender As Object, _
        ByVal e As DataGridViewCellValidatingEventArgs) _
        Handles dataGridView1.CellValidating
    
        ' Validate the CompanyName entry by disallowing empty strings.
        If dataGridView1.Columns(e.ColumnIndex).Name = "CompanyName" Then
            If e.FormattedValue IsNot Nothing AndAlso _
                String.IsNullOrEmpty(e.FormattedValue.ToString()) Then
    
                dataGridView1.Rows(e.RowIndex).ErrorText = _
                    "Company Name must not be empty"
                e.Cancel = True
    
            End If
        End If
    
    End Sub
    
    Private Sub dataGridView1_CellEndEdit(ByVal sender As Object, _
        ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) _
        Handles dataGridView1.CellEndEdit
    
        ' Clear the row error in case the user presses ESC.   
        dataGridView1.Rows(e.RowIndex).ErrorText = String.Empty
    
    End Sub
    
    private void dataGridView1_CellValidating(object sender,
        DataGridViewCellValidatingEventArgs e)
    {
        // Validate the CompanyName entry by disallowing empty strings.
        if (dataGridView1.Columns[e.ColumnIndex].Name == "CompanyName")
        {
            if (e.FormattedValue == null && 
                String.IsNullOrEmpty(e.FormattedValue.ToString()))
            {
                dataGridView1.Rows[e.RowIndex].ErrorText =
                    "Company Name must not be empty";
                e.Cancel = true;
            }
        }
    }
    
    void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
    {
        // Clear the row error in case the user presses ESC.   
        dataGridView1.Rows[e.RowIndex].ErrorText = String.Empty;
    }
    

Test dell'applicazione

È ora possibile verificare il form per assicurarsi che funzioni correttamente.

Per eseguire il test del form

  • Compilare ed eseguire l'applicazione.

    Verrà visualizzato un controllo DataGridView popolato con dati dalla tabella Customers. Quando si fa doppio clic su una cella nella colonna CompanyName, è possibile modificare il valore. Se si eliminano tutti i caratteri e si preme TAB per uscire dalla cella, il controllo DataGridView ne impedisce l'uscita. Quando si digita una stringa non vuota nella cella, il controllo DataGridView consente di lasciare la cella.

Passaggi successivi

Questa applicazione fornisce un'idea di massima delle capacità del controllo DataGridView. È possibile personalizzare l'aspetto e il comportamento del controllo DataGridView in diversi modi:

Vedere anche

Attività

Procedura: convalidare dati nel controllo DataGridView di Windows Form

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

Concetti

Protezione delle informazioni di connessione (ADO.NET)

Riferimenti

DataGridView

BindingSource

Altre risorse

Immissione di dati nel controllo DataGridView Windows Form