Procedura dettagliata: Convalida dei dati nel controllo DataGridView di Windows Forms

Quando si visualizza la funzionalità di immissione dati per gli utenti, spesso è necessario convalidare i dati immessi nel modulo. La DataGridView classe fornisce un modo pratico per eseguire la convalida prima che venga eseguito il commit dei dati nell'archivio dati. È possibile convalidare i dati gestendo l'evento , generato da CellValidating quando la cella corrente DataGridView cambia.

In questa procedura dettagliata verranno recuperate righe dalla tabella Customers del database di esempio Northwind e visualizzate in un controllo DataGridView . Quando un utente modifica una cella nella colonna e tenta di uscire dalla cella, il gestore dell'evento esaminerà la nuova stringa del nome della società per assicurarsi che non sia vuota. Se il nuovo valore è una stringa vuota, impedirà al CompanyName CellValidating cursore dell'utente di uscire dalla cella fino a quando non viene immessa una stringa DataGridView non vuota.

Per copiare il codice in questo argomento come singolo elenco, vedere Procedura: Convalidare i 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 convalidare i dati immessi in un 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);
            this.Text = "DataGridView validation demo (disallows empty CompanyName)";
        }
    
    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]
        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 form per gestire i dettagli della connessione al database.

    Questo esempio di codice usa GetData 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 Windows authentication, nota anche come sicurezza integrata, è un modo più sicuro per controllare l'accesso a un database. 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.
        SqlDataAdapter adapter =
            new SqlDataAdapter(selectCommand, connectionString);
        DataTable data = new DataTable();
        data.Locale = System.Globalization.CultureInfo.InvariantCulture;
        adapter.Fill(data);
    
        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.
        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
    
  3. Implementare un gestore per l'evento del form Load che inizializza e e configura DataGridView BindingSource l'data binding.

    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);
    }
    
    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. Implementare gestori per DataGridView gli eventi e del CellValidating CellEndEdit controllo.

    Il CellValidating gestore eventi consente di determinare se il valore di una cella nella colonna è CompanyName vuoto. Se la convalida del valore della cella non riesce, Cancel impostare la proprietà della classe su System.Windows.Forms.DataGridViewCellValidatingEventArgs true . In questo modo DataGridView il controllo impedisce al cursore di uscire dalla cella. Impostare la ErrorText proprietà sulla riga su una stringa esplicativa. Verrà visualizzata un'icona di errore con una descrizione comando contenente il testo dell'errore. Nel gestore CellEndEdit eventi impostare la proprietà nella riga sulla stringa ErrorText vuota. L'evento si verifica solo quando la cella esce dalla modalità di modifica, operazione che non può eseguire se la convalida non CellEndEdit riesce.

    private void dataGridView1_CellValidating(object sender,
        DataGridViewCellValidatingEventArgs e)
    {
        string headerText =
            dataGridView1.Columns[e.ColumnIndex].HeaderText;
    
        // Abort validation if cell is not in the CompanyName column.
        if (!headerText.Equals("CompanyName")) return;
    
        // Confirm that the cell is not empty.
        if (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;
    }
    
    Private Sub dataGridView1_CellValidating(ByVal sender As Object, _
        ByVal e As DataGridViewCellValidatingEventArgs) _
        Handles dataGridView1.CellValidating
    
        Dim headerText As String = _
            dataGridView1.Columns(e.ColumnIndex).HeaderText
    
        ' Abort validation if cell is not in the CompanyName column.
        If Not headerText.Equals("CompanyName") Then Return
    
        ' Confirm that the cell is not empty.
        If (String.IsNullOrEmpty(e.FormattedValue.ToString())) Then
            dataGridView1.Rows(e.RowIndex).ErrorText = _
                "Company Name must not be empty"
            e.Cancel = True
        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
    

Test dell'applicazione

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

Per testare il modulo

  • Compilare l'applicazione ed eseguirla.

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

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:

  • Modificare gli stili del bordo e dell'intestazione. Per altre informazioni, vedere Procedura: Modificare gli stili bordo e griglia nel controllo DataGridView Windows Form.

  • Abilitare o limitare l'input dell'utente al DataGridView controllo. Per altre informazioni, vedere Procedura: Impedire l'aggiunta e l'eliminazione di righe nel controllo DataGridViewdi Windows Forms e Procedura: Creare colonne Read-Only nel controllo DataGridViewWindows Forms .

  • Controllare l'input dell'utente per verificare la presenza di errori correlati al database. Per altre informazioni, vedere Procedura dettagliata: Gestione degli errori che si verificano durante l'immissione di dati nel controllo DataGridView Windows Form.

  • Gestire set di dati di grandi dimensioni usando la modalità virtuale. Per altre informazioni, vedere Procedura dettagliata: Implementazione dellamodalità virtuale nel controllo DataGridView Windows Form .

  • Personalizzare l'aspetto delle celle. Per altre informazioni, vedere Procedura: Personalizzare l'aspetto delle celle nel controllo DataGridView di Windows Forms e Procedura: Impostare stili di carattere e colori nel controllo DataGridView Windows Forms.

Vedi anche