Delen via


Overzicht: Gegevens valideren in het Besturingselement Windows Forms DataGridView

Wanneer u functionaliteit voor gegevensinvoer weergeeft aan gebruikers, moet u vaak de gegevens valideren die in uw formulier zijn ingevoerd. De DataGridView-klasse biedt een handige manier om validatie uit te voeren voordat gegevens worden doorgevoerd in het gegevensarchief. U kunt gegevens valideren door de CellValidating gebeurtenis te verwerken, die wordt gegenereerd door de DataGridView wanneer de huidige cel verandert.

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 gebruiker een cel in de kolom CompanyName bewerkt en de cel probeert te verlaten, onderzoekt de CellValidating gebeurtenis-handler de nieuwe bedrijfsnaamtekenreeks om er zeker van te zijn dat deze niet leeg is; als de nieuwe waarde een lege tekenreeks is, voorkomt de DataGridView dat de cursor van de gebruiker de cel verlaat totdat een niet-lege tekenreeks wordt ingevoerd.

Zie Hoe te doen: Gegevens valideren in het Windows Forms DataGridView-besturingselementom de code in dit onderwerp als één lijst te kopiëren.

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

Gegevens valideren die zijn ingevoerd in een DataGridView

  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);
            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. 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.
        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. 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 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. Implementeer handlers voor de DataGridView- en CellValidating-gebeurtenissen van het CellEndEdit besturingselement.

    In de CellValidating gebeurtenis-handler bepaalt u of de waarde van een cel in de kolom CompanyName leeg is. Als de celwaarde de validatie niet doorstaat, stel dan de eigenschap Cancel van de klasse System.Windows.Forms.DataGridViewCellValidatingEventArgs in op true. Hierdoor voorkomt het DataGridView-besturingselement dat de cursor de cel verlaat. Stel de eigenschap ErrorText in de rij in op een verklarende tekenreeks. Hiermee wordt een foutpictogram weergegeven met een knopinfo die de fouttekst bevat. Stel in de CellEndEdit event handler de eigenschap ErrorText van de rij in op de lege tekenreeks. De gebeurtenis CellEndEdit treedt alleen op wanneer de cel de bewerkingsmodus verlaat. Dit kan niet worden uitgevoerd als de validatie mislukt.

    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
    

De toepassing testen

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

Om het formulier te testen

  • Compileer de toepassing en voer deze uit.

    U ziet een DataGridView gevuld met gegevens uit de Customers tabel. Wanneer u dubbelklikt op een cel in de kolom CompanyName, kunt u de waarde bewerken. Als u alle tekens verwijdert en op de TAB-toets drukt om de cel af te sluiten, voorkomt de DataGridView dat u de cel afsluit. Wanneer u een niet-lege tekenreeks in de cel typt, laat het besturingselement DataGridView u de cel verlaten.

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