Wskazówki: sprawdzanie poprawności danych w formancie DataGridView formularzy systemu Windows

Podczas wyświetlania użytkownikom funkcji wprowadzania danych często trzeba zweryfikować dane wprowadzone w formularzu. Klasa DataGridView zapewnia wygodny sposób przeprowadzania walidacji przed zatwierdzeniem danych w magazynie danych. Dane można zweryfikować, obsługując CellValidating zdarzenie, które jest wywoływane przez DataGridView czas zmiany bieżącej komórki.

W tym przewodniku pobierzesz wiersze z Customers tabeli w przykładowej bazie danych Northwind i wyświetlisz je w kontrolce DataGridView . Gdy użytkownik edytuje komórkę w CompanyName kolumnie i próbuje opuścić komórkę, procedura obsługi zdarzeń zbada nowy ciąg nazwy firmy, aby upewnić się, CellValidating że nie jest pusta. Jeśli nowa wartość jest pustym ciągiem, DataGridView kursor użytkownika uniemożliwi pozostawienie komórki do momentu wprowadzenia niepustego ciągu.

Aby skopiować kod w tym temacie jako pojedynczą listę, zobacz How to: Validate Data in the Windows Forms DataGridView Control (Instrukcje: weryfikowanie danych w kontrolce DataGridView formularzy systemu Windows).

Wymagania wstępne

Aby ukończyć ten przewodnik, potrzebne są następujące elementy:

  • Dostęp do serwera z przykładową bazą danych Northwind SQL Server.

Tworzenie formularza

Aby zweryfikować dane wprowadzone w obiekcie DataGridView

  1. Utwórz klasę, która pochodzi z Form i zawiera kontrolkę DataGridViewBindingSource i składnik.

    Poniższy przykład kodu zawiera podstawowe inicjowanie i zawiera metodę Main .

    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. Zaimplementuj metodę w definicji klasy formularza do obsługi szczegółów nawiązywania połączenia z bazą danych.

    W tym przykładzie kodu użyto GetDataDataTable metody zwracającej wypełniony obiekt. Upewnij się, że zmienna connectionString jest ustawiona na wartość odpowiednią dla bazy danych.

    Ważne

    Przechowywanie poufnych informacji, takich jak hasło, w parametry połączenia może mieć wpływ na bezpieczeństwo aplikacji. Korzystanie z uwierzytelniania systemu Windows, nazywanego również zintegrowanymi zabezpieczeniami, to bezpieczniejszy sposób kontrolowania dostępu do bazy danych. Aby uzyskać więcej informacji, zobacz Ochrona informacji o Połączenie ion.

    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. Zaimplementuj procedurę obsługi dla zdarzenia formularzaLoad, które inicjuje element i BindingSource konfiguruje DataGridView powiązanie danych.

    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. Zaimplementuj DataGridView programy obsługi dla zdarzeń i CellEndEdit kontrolekCellValidating.

    Procedura CellValidating obsługi zdarzeń określa, czy wartość komórki w kolumnie CompanyName jest pusta. Jeśli walidacja wartości komórki zakończy się niepowodzeniem, ustaw Cancel właściwość System.Windows.Forms.DataGridViewCellValidatingEventArgs klasy na true. Powoduje to, że kontrolka DataGridView uniemożliwia pozostawienie komórki kursora. ErrorText Ustaw właściwość w wierszu na ciąg objaśniający. Spowoduje to wyświetlenie ikony błędu z etykietką narzędzia zawierającą tekst błędu. W procedurze obsługi zdarzeń CellEndEdit ustaw ErrorText właściwość w wierszu na pusty ciąg. Zdarzenie CellEndEdit występuje tylko wtedy, gdy komórka kończy tryb edycji, którego nie może zrobić, jeśli zakończy się niepowodzeniem walidacji.

    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
    

Testowanie aplikacji

Teraz możesz przetestować formularz, aby upewnić się, że działa zgodnie z oczekiwaniami.

Aby przetestować formularz

  • Skompiluj i uruchom aplikację.

    Zobaczysz DataGridView wypełnione dane z Customers tabeli. Po dwukrotnym kliknięciu komórki w kolumnie CompanyName możesz edytować wartość. Jeśli usuniesz wszystkie znaki i naciśnij klawisz TAB, aby zamknąć komórkę, DataGridView funkcja uniemożliwia wyjście z komórki. Podczas wpisywania ciągu niepustego do komórki kontrolka DataGridView umożliwia wyjście z komórki.

Następne kroki

Ta aplikacja zapewnia podstawową wiedzę na temat DataGridView możliwości kontrolki. Wygląd i zachowanie kontrolki DataGridView można dostosować na kilka sposobów:

Zobacz też