Compartilhar via


Passo a passo: tratamento de erros que ocorrem durante a entrada de dados no controle DataGridView dos Windows Forms

O tratamento de erros do armazenamento de dados subjacente é um recurso necessário para um aplicativo de entrada de dados. O controle DataGridView do Windows Forms torna isso fácil ao expor o evento DataError, que é disparado quando o armazenamento de dados detecta uma violação de restrição ou uma violação de regra de negócios.

Neste passo a passo, você recuperará linhas da tabela Customers no banco de dados de exemplo Northwind e as exibirá em um controle DataGridView. Quando um valor CustomerID duplicado for detectado em uma nova linha ou em uma linha existente editada, o evento DataError ocorrerá, que será tratado exibindo um MessageBox que descreve a exceção.

Para copiar o código neste tópico como uma única listagem, consulte Como manipular erros que ocorrem durante a entrada de dados no controle DataGridView do Windows Forms.

Pré-requisitos

Para concluir este passo a passo, você precisará de:

  • Acesso a um servidor que tem o banco de dados de exemplo do Northwind SQL Server.

Criando o formulário

Para lidar com erros de entrada de dados no controle DataGridView

  1. Crie uma classe que deriva de Form e contém um controle DataGridView e um componente BindingSource.

    O exemplo de código a seguir fornece inicialização básica e inclui um método 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. Implemente um método na definição de classe do formulário para lidar com os detalhes da conexão com o banco de dados.

    Este exemplo de código usa um método GetData que retorna um objeto DataTable populado. Defina a variável connectionString como um valor apropriado para seu banco de dados.

    Importante

    Armazenar informações confidenciais, como uma senha, dentro da cadeia de conexão pode afetar a segurança do aplicativo. Usar a Autenticação do Windows (também conhecida como segurança integrada) é uma maneira mais segura de controlar o acesso a um banco de dados. Para obter mais informações, consulte Protegendo informações de conexão.

    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. Implemente um manipulador para o evento Load do formulário que inicializa o DataGridView e BindingSource e configura a associação de dados.

    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. Manipule o evento DataError no DataGridView.

    Se o contexto do erro for uma operação de confirmação, exiba o erro em um 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
    

Testando o aplicativo

Agora você pode testar o formulário para garantir que ele se comporte conforme o esperado.

Para testar o formulário

  • Pressione F5 para executar o aplicativo.

    Você verá um controle DataGridView preenchido com dados da tabela Clientes. Se você inserir um valor duplicado para CustomerID e confirmar a edição, o valor da célula será revertido automaticamente e você verá um MessageBox que exibe o erro de entrada de dados.

Próximas etapas

Este aplicativo fornece uma compreensão básica dos recursos do controle DataGridView. Você pode personalizar a aparência e o comportamento do controle DataGridView de várias maneiras:

Consulte também