다음을 통해 공유


안내: Windows Forms DataGridView 컨트롤에서 데이터 유효성 검사하기

사용자에게 데이터 입력 기능을 표시할 때 양식에 입력한 데이터의 유효성을 검사해야 하는 경우가 자주 있습니다. DataGridView 클래스는 데이터가 데이터 저장소에 커밋되기 전에 유효성 검사를 보다 쉽게 수행할 수 있는 방법을 제공합니다. 현재 셀이 변경될 때 DataGridView에 의해 발생하는 CellValidating 이벤트를 처리하여 데이터의 유효성을 검사할 수 있습니다.

이 연습에서는 Northwind 샘플 데이터베이스의 Customers 표에서 행을 검색하고 이를 DataGridView 컨트롤에 표시합니다. 사용자가 CompanyName 열의 셀을 편집하고 셀을 나가려고 하면, CellValidating 이벤트 처리기가 새 회사 이름 문자열이 비어 있지 않은지 검사합니다. 새 값이 빈 문자열인 경우, DataGridView가 비어 있지 않은 문자열이 입력될 때까지 사용자의 커서가 셀을 벗어나지 못하도록 합니다.

이 항목의 코드를 하나의 목록으로 복사하려면 방법: Windows Forms DataGridView 컨트롤에서 데이터 유효성 검사하는 법을 참조하세요.

필수 조건

이 절차를 완료하려면 다음이 필요합니다.

  • Northwind SQL Server 샘플 데이터베이스가 있는 서버에 대한 액세스 권한.

폼 만들기

DataGridView에 입력한 데이터의 유효성 검사

  1. Form에서 파생되고 DataGridView 컨트롤 및 BindingSource 구성 요소를 포함하는 클래스를 만드십시오.

    다음 코드 예제에서는 기본 초기화를 제공하고 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. 데이터베이스 연결의 세부 정보를 처리하기 위한 양식의 클래스 정의에 메서드를 구현합니다.

    이 코드 예제에서는 채워진 DataTable 개체를 반환하는 GetData 메서드를 사용합니다. connectionString 변수를 데이터베이스에 적합한 값으로 설정하십시오.

    중요합니다

    암호와 같은 중요한 정보를 연결 문자열 내에 저장하면 애플리케이션 보안 문제가 발생할 수 있습니다. 데이터베이스 액세스를 제어할 경우에는 통합 보안이라고도 하는 Windows 인증을 사용하는 쪽이 더 안전합니다. 자세한 내용은 연결 정보 보호를 참조하세요.

    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. 폼의 Load 이벤트에 대한 처리기를 구현하여 DataGridViewBindingSource를 초기화하고 데이터 바인딩을 설정합니다.

    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. DataGridView 컨트롤의 CellValidatingCellEndEdit 이벤트에 대한 처리기를 구현합니다.

    CellValidating 이벤트 처리기에서 CompanyName 열의 셀 값이 비어 있는지 여부를 판별합니다. 셀 값이 유효성 검사에 실패하는 경우 클래스의 속성을 로 설정합니다. 이렇게 하면 DataGridView 컨트롤이 커서가 셀을 벗어나지 못하도록 합니다. 행의 ErrorText 속성을 설명 문자열로 설정합니다. 오류 아이콘이 오류 텍스트가 포함된 도구 설명과 함께 표시됩니다. CellEndEdit 이벤트 처리기에서 행의 ErrorText 속성을 빈 문자열로 설정합니다. CellEndEdit 이벤트는 셀이 편집 모드를 종료할 때만 발생하며, 유효성 검사를 통과하지 못할 경우 이벤트는 발생하지 않습니다.

    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
    

애플리케이션 테스트

이제 양식을 테스트하여 예상대로 동작하는지 확인할 수 있습니다.

양식을 테스트하려면

  • 애플리케이션을 컴파일하고 실행합니다.

    데이터가 Customers 테이블에서 가져와 DataGridView에 채워질 것입니다. CompanyName 열에서 셀을 두 번 클릭하면 값을 편집할 수 있습니다. 모든 문자를 삭제하고 TAB 키를 눌러 셀을 벗어나려고 하면 DataGridView가 이를 방지합니다. 비어 있지 않은 문자열을 셀에 입력하면 DataGridView 컨트롤을 통해 셀을 벗어날 수 있습니다.

다음 단계

이 애플리케이션은 DataGridView 컨트롤의 기능에 대한 기본적인 이해를 제공합니다. 다음과 같은 여러 가지 방법으로 DataGridView 컨트롤의 모양과 동작을 사용자 지정할 수 있습니다.

참고하십시오