Exemplarische Vorgehensweise: Validieren von Daten im DataGridView-Steuerelement in Windows Forms

Bei der Anzeige von Dateneingabefunktionen für Benutzer müssen die in das Formular eingegebenen Daten häufig validiert werden. Die DataGridView-Klasse bietet eine bequeme Möglichkeit zur Datenvalidierung, bevor für die Daten ein Commit ausgeführt und sie im Datenspeicher abgelegt werden. Sie können Daten validieren, indem Sie das CellValidating-Ereignis behandeln, das von DataGridView ausgelöst wird, sobald sich die aktuelle Zelle ändert.

In dieser exemplarischen Vorgehensweise rufen Sie Zeilen aus der Tabelle Customers in der Beispieldatenbank Northwind ab und zeigen diese in einem DataGridView-Steuerelement an. Wenn ein Benutzer eine Zelle in der Spalte CompanyName bearbeitet und die Zelle anschließend verlassen möchte, wird die Zeichenfolge mit dem neuen Firmennamen vom CellValidating-Ereignishandler überprüft, um sicherzustellen, dass sie nicht leer ist. Wenn es sich bei dem neuen Wert um eine leere Zeichenfolge handelt, wird durch DataGridView verhindert, dass der Mauscursor des Benutzers in eine andere Zelle verschoben werden kann, bevor eine nicht leere Zeichenfolge eingegeben wird.

Informationen zum Kopieren des in diesem Thema behandelten Codes als einzelne Auflistung finden Sie unter Gewusst wie: Überprüfen von Daten im DataGridView-Steuerelement in Windows Forms.

Vorbereitungsmaßnahmen

Für die Durchführung dieser exemplarischen Vorgehensweise benötigen Sie Folgendes:

  • Zugriff auf einen Server mit der SQL Server-Beispieldatenbank Northwind

Erstellen des Formulars

So validieren Sie die in DataGridView eingegebenen Daten

  1. Erstellen Sie eine Klasse, die von Form abgeleitet ist und die ein DataGridView-Steuerelement sowie eine BindingSource-Komponente enthält.

    Im folgenden Codebeispiel werden grundlegende Initialisierungsfeatures und eine Main-Methode dargestellt.

    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. Implementieren Sie in der Klassendefinition des Formulars eine Methode zum Behandeln der Verbindungsdetails für die Datenbank.

    In diesem Codebeispiel wird eine GetData -Methode verwendet, die ein gefülltes DataTable-Objekt zurückgibt. Die connectionString-Variable muss auf einen Wert festgelegt werden, der für Ihre Datenbank geeignet ist.

    SicherheitshinweisSicherheitshinweis

    Das Speichern vertraulicher Informationen, beispielsweise Kennwörter, innerhalb der Verbindungszeichenfolge kann die Sicherheit einer Anwendung beeinträchtigen. Sicherer lässt sich der Zugriff auf eine Datenbank mithilfe der Windows-Authentifizierung (wird auch als integrierte Sicherheit bezeichnet) steuern. Weitere Informationen finden Sie unter Schützen von Verbindungsinformationen (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. Implementieren Sie einen Handler für das Load-Ereignis des Formulars, durch das DataGridView und BindingSource initialisiert und die Datenbindung eingerichtet werden.

    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. Implementieren Sie Handler für das CellValidating-Ereignis und das CellEndEdit-Ereignis des DataGridView-Steuerelements.

    Mithilfe des CellValidating-Ereignishandlers wird festgestellt, ob der Wert einer Zelle in der Spalte CompanyName leer ist. Wenn die Validierung des Zellenwerts fehlschlägt, legen Sie die Cancel-Eigenschaft der System.Windows.Forms.DataGridViewCellValidatingEventArgs-Klasse auf true fest. Auf diese Weise verhindert das DataGridView-Steuerelement, dass der Cursor die Zelle verlässt. Legen Sie für die ErrorText-Eigenschaft in der Zeile eine Zeichenfolge mit einer Erläuterung fest. Auf diese Weise wird ein Fehlersymbol mit einer QuickInfo angezeigt, die den Fehlertext enthält. Legen Sie im CellEndEdit-Ereignishandler die ErrorText-Eigenschaft in der Zeile auf die leere Zeichenfolge fest. Das CellEndEdit-Ereignis tritt nur ein, wenn die Zelle den Bearbeitungsmodus verlässt, was nicht möglich ist, wenn die Validierung fehlschlägt.

    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
    
    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;
    }
    

Testen der Anwendung

Sie können das Formular jetzt testen und prüfen, ob es sich wie erwartet verhält.

So testen Sie das Formular

  • Kompilieren Sie die Anwendung, und führen Sie sie aus.

    Sie sehen ein DataGridView-Steuerelement, das Daten aus der Tabelle Customers enthält. Wenn Sie auf eine Zelle in der Spalte CompanyName doppelklicken, können Sie den Wert bearbeiten. Wenn Sie sämtliche Zeichen löschen und die TAB-TASTE drücken, um in die nächste Zelle zu wechseln, werden Sie durch DataGridView daran gehindert. Wenn Sie eine nicht leere Zeichenfolge in die Zelle eingeben, werden Sie vom DataGridView-Steuerelement nicht daran gehindert, die Zelle zu verlassen.

Nächste Schritte

Anhand dieser Anwendung erhalten Sie einen grundlegenden Einblick in die Fähigkeiten des DataGridView-Steuerelements. Sie können die Darstellung und das Verhalten des DataGridView-Steuerelements auf vielfältige Weisen anpassen:

Siehe auch

Aufgaben

Gewusst wie: Überprüfen von Daten im DataGridView-Steuerelement in Windows Forms

Exemplarische Vorgehensweise: Behandeln von Fehlern, die während der Dateneingabe im DataGridView-Steuerelement in Windows Forms auftreten

Referenz

DataGridView

BindingSource

Konzepte

Schützen von Verbindungsinformationen (ADO.NET)

Weitere Ressourcen

Dateneingabe im DataGridView-Steuerelement in Windows Forms