Partilhar via


Passo a passo: Validando dados no controle DataGridView do Windows Forms

Quando você exibe a funcionalidade de entrada de dados para os usuários, frequentemente precisa validar os dados inseridos em seu formulário. A classe DataGridView fornece uma maneira conveniente de executar a validação antes que os dados sejam confirmados no armazenamento de dados. Você pode validar dados manipulando o evento CellValidating, que é gerado pelo DataGridView quando a célula atual é alterada.

Nesta explicação 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 usuário edita uma célula na coluna CompanyName e tenta sair da célula, o manipulador de eventos CellValidating examinará a nova cadeia de caracteres de nome da empresa para garantir que ela não esteja vazia; Se o novo valor for uma cadeia de caracteres vazia, o DataGridView impedirá que o cursor do usuário saia da célula até que uma cadeia de caracteres não vazia seja inserida.

Para copiar o código neste tópico como uma única listagem, consulte Como validar dados no controle DataGridView do Windows Forms.

Pré-requisitos

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

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

Criando o formulário

Para validar dados inseridos em um 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);
            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. 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 preenchido. Certifique-se de definir a variável connectionString para um valor apropriado para seu banco de dados.

    Importante

    O armazenamento de informações confidenciais, como uma senha, na cadeia de conexão pode afetar a segurança do seu 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 dados 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.
        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. Implemente um manipulador para o evento Load do formulário que inicializa o DataGridView e o BindingSource e configura a associação de dados.

    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. Implemente manipuladores para os eventos DataGridView e CellValidating do controle CellEndEdit.

    O manipulador de eventos CellValidating é onde você determina se o valor de uma célula na coluna CompanyName está vazio. Se o valor da célula falhar na validação, defina a propriedade Cancel da classe System.Windows.Forms.DataGridViewCellValidatingEventArgs como true. Isso faz com que o controle DataGridView impeça que o cursor saia da célula. Defina a propriedade ErrorText na linha como uma cadeia de caracteres explicativa. Isso exibe um ícone de erro com um tooltip que contém o texto de erro. No manipulador de eventos CellEndEdit, defina a propriedade ErrorText na linha como a cadeia de caracteres vazia. O evento CellEndEdit ocorre somente quando a célula sai do modo de edição, o que não pode ser feito se falhar na validação.

    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
    

Testando o aplicativo

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

Para testar o formulário

  • Compile e execute o aplicativo.

    Você verá um DataGridView preenchido com dados da tabela Customers. Ao clicar duas vezes em uma célula na coluna CompanyName, você pode editar o valor. Se você excluir todos os caracteres e pressionar a tecla TAB para sair da célula, o DataGridView impedirá que você saia. Quando você digita uma cadeia de caracteres não vazia na célula, o controle DataGridView permite que você saia da célula.

Próximas Etapas

Esta aplicação dá-lhe uma compreensão básica das capacidades do controlo DataGridView. Você pode personalizar a aparência e o comportamento do controle de DataGridView de várias maneiras:

Ver também