연습: Windows Forms DataGridView 컨트롤에서 데이터 입력 중에 발생하는 오류 처리
기본 데이터 저장소에서 오류를 처리하는 것은 데이터 입력 애플리케이션에 필요한 기능입니다. Windows Forms DataGridView 컨트롤을 사용하면 데이터 저장소에서 제약 조건 위반 또는 손상된 비즈니스 규칙을 감지할 때 발생하는 DataError 이벤트를 노출하여 이 작업을 쉽게 수행할 수 있습니다.
이 연습에서는 Northwind 샘플 데이터베이스의 Customers
표에서 행을 검색하고 이를 DataGridView 컨트롤에 표시합니다. 새 행 또는 편집된 기존 행에서 중복 CustomerID
값이 검색되면 예외를 설명하는 MessageBox 을(를) 표시하여 처리되는 DataError 이벤트가 발생합니다.
이 항목의 코드를 단일 목록으로 복사하려면 방법: Windows Forms DataGridView 컨트롤에서 데이터 입력 중에 발생하는 오류 처리를 참조하세요.
사전 요구 사항
이 연습을 완료하려면 다음 사항이 필요합니다.
- Northwind SQL Server 샘플 데이터베이스가 있는 서버에 대한 액세스 권한.
폼 만들기
DataGridView 컨트롤에서 데이터 입력 오류를 처리하려면
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); }
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
데이터베이스 연결의 세부 정보를 처리하기 위한 양식의 클래스 정의에 메서드를 구현합니다.
이 코드 예제에서는 채워진 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, 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
DataGridView 및 Load를 초기화하고 데이터 바인딩을 설정하는 양식의 BindingSource 이벤트에 대한 처리기를 구현합니다.
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
DataGridView에서 DataError 이벤트를 처리합니다.
오류의 컨텍스트가 커밋 작업인 경우 오류를 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
애플리케이션 테스트
이제 양식을 테스트하여 예상대로 동작하는지 확인할 수 있습니다.
양식을 테스트하려면
F5 키를 눌러 애플리케이션을 실행합니다.
Customers 테이블의 데이터로 채워진 DataGridView 컨트롤이 표시됩니다.
CustomerID
의 중복 값을 입력하고 편집을 커밋하면 셀 값이 자동으로 되돌아가고 데이터 입력 오류를 표시하는 MessageBox볼 수 있습니다.
다음 단계
이 애플리케이션은 DataGridView 컨트롤의 기능에 대한 기본적인 이해를 제공합니다. 다음과 같은 여러 가지 방법으로 DataGridView 컨트롤의 모양과 동작을 사용자 지정할 수 있습니다.
테두리 및 헤더 스타일을 변경합니다. 자세한 내용은 방법: 테두리 및 Windows Forms DataGridView 컨트롤의 모눈선 스타일 변경합니다.
DataGridView 컨트롤에 대한 사용자 입력을 사용 설정 또는 제한합니다. 자세한 내용은 방법: Windows Forms DataGridView 컨트롤에서 행 추가 및 삭제 방지 및 방법: Windows Forms DataGridView 컨트롤에서 열을 읽기 전용으로 설정을 참조하세요.
DataGridView 컨트롤에 대한 사용자 입력의 유효성을 검사합니다. 자세한 내용은 연습: Windows Forms DataGridView 컨트롤의 데이터 유효성 검사를 참조하세요.
가상 모드를 사용하여 매우 큰 데이터 세트를 처리합니다. 자세한 내용은 연습: Windows Forms DataGridView 컨트롤에서 가상 모드 구현을 참조하세요.
셀의 모양을 사용자 지정합니다. 자세한 내용은 방법: Windows Forms DataGridView 컨트롤에서 셀 모양 사용자 지정 및 방법: Windows Forms DataGridView 컨트롤에 기본 셀 스타일 설정을 참조하세요.
참고 항목
.NET Desktop feedback
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기