Wskazówki: obsługa błędów występujących podczas wprowadzania danych w formancie DataGridView formularzy systemu Windows

Obsługa błędów z bazowego magazynu danych jest wymaganą funkcją aplikacji do wprowadzania danych. Kontrolka Formularze systemu DataGridView Windows ułatwia ujawnienie DataError zdarzenia, które jest wywoływane, gdy magazyn danych wykryje naruszenie ograniczeń lub uszkodzoną regułę biznesową.

W tym przewodniku pobierzesz wiersze z Customers tabeli w przykładowej bazie danych Northwind i wyświetlisz je w kontrolce DataGridView . Po wykryciu zduplikowanej CustomerID wartości w nowym wierszu lub edytowanym istniejącym wierszu DataError nastąpi zdarzenie, które zostanie obsłużone przez wyświetlenie wyjątku MessageBox opisującego wyjątek.

Aby skopiować kod w tym temacie jako pojedynczą listę, zobacz Instrukcje: obsługa błędów występujących podczas wprowadzania 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 obsłużyć błędy wprowadzania danych w kontrolce 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);
        }
    
    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)
    
        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 (znanego również jako zabezpieczenia zintegrowane) jest bezpieczniejszym sposobem na kontrolowanie 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, including the
        // schema information that contains the CustomerID column
        // constraint.
        SqlDataAdapter adapter =
            new SqlDataAdapter(selectCommand, connectionString);
        DataTable data = new DataTable();
        data.Locale = System.Globalization.CultureInfo.InvariantCulture;
        adapter.Fill(data);
        adapter.FillSchema(data, SchemaType.Source);
    
        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, including the 
        ' schema information that contains the CustomerID column 
        ' constraint.
        Dim adapter As New SqlDataAdapter(selectCommand, connectionString)
        Dim data As New DataTable()
        data.Locale = System.Globalization.CultureInfo.InvariantCulture
        adapter.Fill(data)
        adapter.FillSchema(data, SchemaType.Source)
    
        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 the DataError event to the corresponding event handler.
        this.dataGridView1.DataError +=
            new DataGridViewDataErrorEventHandler(dataGridView1_DataError);
    
        // 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. DataError Obsłuż zdarzenie w obiekcie DataGridView.

    Jeśli kontekstem błędu jest operacja zatwierdzania, wyświetl błąd w pliku MessageBox.

    private void dataGridView1_DataError(object sender,
        DataGridViewDataErrorEventArgs e)
    {
        // If the data source raises an exception when a cell value is
        // commited, display an error message.
        if (e.Exception != null &&
            e.Context == DataGridViewDataErrorContexts.Commit)
        {
            MessageBox.Show("CustomerID value must be unique.");
        }
    }
    
    Private Sub dataGridView1_DataError(ByVal sender As Object, _
        ByVal e As DataGridViewDataErrorEventArgs) _
        Handles dataGridView1.DataError
    
        ' If the data source raises an exception when a cell value is 
        ' commited, display an error message.
        If e.Exception IsNot Nothing AndAlso _
            e.Context = DataGridViewDataErrorContexts.Commit Then
    
            MessageBox.Show("CustomerID value must be unique.")
    
        End If
    
    End Sub
    

Testowanie aplikacji

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

Aby przetestować formularz

  • Naciśnij klawisz F5, aby uruchomić aplikację.

    Zostanie wyświetlona kontrolka DataGridView wypełniona danymi z tabeli Customers. Jeśli wprowadzisz zduplikowaną wartość i CustomerID zatwierdzisz edycję, wartość komórki zostanie przywrócona automatycznie i zostanie wyświetlony MessageBox komunikat o błędzie wprowadzania danych.

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ż