Windows Forms에서 사용자 입력 유효성 검사User Input Validation in Windows Forms

사용자가 응용 프로그램에 데이터를 입력 하는 경우 응용 프로그램에서 사용 하기 전에 데이터가 유효한 지 확인 해야 할 수 있습니다.When users enter data into your application, you may want to verify that the data is valid before your application uses it. 특정 텍스트 필드의 길이는 0이 아니어야 하 고, 필드는 전화 번호 또는 형식이 올바른 형식의 데이터로 포맷 되거나, 데이터베이스의 보안을 손상 시키는 데 사용할 수 있는 안전 하지 않은 문자를 포함 하지 않을 수 있습니다.You may require that certain text fields not be zero-length, that a field be formatted as a telephone number or other type of well-formed data, or that a string not contain any unsafe characters that could be used to compromise the security of a database. Windows Forms는 응용 프로그램에서 입력의 유효성을 검사 하는 여러 가지 방법을 제공 합니다.Windows Forms provides several ways for you to validate input in your application.

MaskedTextBox 컨트롤을 사용 하 여 유효성 검사Validation with the MaskedTextBox Control

사용자가 전화 번호 또는 부품 번호와 같은 잘 정의 된 형식으로 데이터를 입력 해야 하는 경우 컨트롤을 MaskedTextBox 사용 하 여 코드를 최소한으로 빠르게 수행할 수 있습니다.If you need to require users to enter data in a well-defined format, such as a telephone number or a part number, you can accomplish this quickly and with minimal code by using the MaskedTextBox control. 마스크 는 텍스트 상자의 지정 된 위치에 입력할 수 있는 문자를 지정 하는 마스킹 언어의 문자로 구성 된 문자열입니다.A mask is a string made up of characters from a masking language that specifies which characters can be entered at any given position in the text box. 컨트롤은 사용자에 게 프롬프트 집합을 표시 합니다.The control displays a set of prompts to the user. 사용자가 잘못 된 항목을 입력 하는 경우, 예를 들어 숫자가 필요할 때 문자를 입력 하면 컨트롤에서 자동으로 입력을 거부 합니다.If the user types an incorrect entry, for example, the user types a letter when a digit is required, the control will automatically reject the input.

에서 MaskedTextBox 사용 하는 마스킹 언어는 매우 유연 합니다.The masking language that is used by MaskedTextBox is very flexible. 이 기능을 사용 하면 필요한 문자, 선택적 문자, 문자 (예: 하이픈 및 괄호, 통화 문자 및 날짜 구분 기호)를 지정할 수 있습니다.It allows you to specify required characters, optional characters, literal characters, such as hyphens and parentheses, currency characters, and date separators. 컨트롤은 데이터 소스에 바인딩된 경우에도 잘 작동 합니다.The control also works well when bound to a data source. 데이터 바인딩의 Parse 이벤트를 사용 하 여 마스크를 따르도록 들어오는 데이터의 서식을 다시 지정 하 고, 이벤트를 사용 하 여 데이터 필드의 사양을 따르도록 보내는 데이터의 서식을 다시 지정할 수 있습니다. FormatThe Format event on a data binding can be used to reformat incoming data to comply with the mask, and the Parse event can be used to reformat outgoing data to comply with the specifications of the data field.

자세한 내용은 MaskedTextBox Control을 참조 하세요.For more information, see MaskedTextBox Control.

이벤트 기반 유효성 검사Event-Driven Validation

유효성 검사를 완전히 프로그래밍 방식으로 제어 하거나 복잡 한 유효성 검사를 수행 해야 하는 경우 대부분의 Windows Forms 컨트롤에 기본 제공 되는 유효성 검사 이벤트를 사용 해야 합니다.If you want full programmatic control over validation, or need to perform complex validation checks, you should use the validation events built into most Windows Forms controls. 자유 형식 사용자 입력을 허용 하는 각 컨트롤에 Validating 는 컨트롤에 데이터 유효성 검사가 필요할 때마다 발생 하는 이벤트가 있습니다.Each control that accepts free-form user input has a Validating event that will occur whenever the control requires data validation. 이벤트 처리 Validating 메서드에서는 여러 가지 방법으로 사용자 입력의 유효성을 검사할 수 있습니다.In the Validating event-handling method, you can validate user input in several ways. 예를 들어 우편 번호를 포함 해야 하는 텍스트 상자가 있는 경우 다음과 같은 방법으로 유효성 검사를 수행할 수 있습니다.For example, if you have a text box that must contain a postal code, you can perform the validation in the following ways:

  • 우편 번호가 특정 우편 번호 그룹에 속해야 하는 경우 입력에 대해 문자열 비교를 수행 하 여 사용자가 입력 한 데이터의 유효성을 검사할 수 있습니다.If the postal code must belong to a specific group of zip codes, you can perform a string comparison on the input to validate the data entered by the user. 예를 들어 우편 번호가 {10001, 10002, 10003} 집합에 있어야 하는 경우 문자열 비교를 사용 하 여 데이터의 유효성을 검사할 수 있습니다.For example, if the postal code must be in the set {10001, 10002, 10003}, then you can use a string comparison to validate the data.

  • 우편 번호가 특정 폼에 있어야 하는 경우 정규식을 사용 하 여 사용자가 입력 한 데이터의 유효성을 검사할 수 있습니다.If the postal code must be in a specific form you can use regular expressions to validate the data entered by the user. 예를 들어 또는 ##### #####-####폼의 유효성을 검사 하기 위해 정규식을 사용할 ^(\d{5})(-\d{4})?$수 있습니다.For example, to validate the form ##### or #####-####, you can use the regular expression ^(\d{5})(-\d{4})?$. 양식의 A#A #A#유효성을 검사 하기 위해 [A-Z]\d[A-Z] \d[A-Z]\d정규식을 사용할 수 있습니다.To validate the form A#A #A#, you can use the regular expression [A-Z]\d[A-Z] \d[A-Z]\d. 정규식에 대 한 자세한 내용은 정규식 및 정규식 예제 .NET Framework 를 참조 하세요.For more information about regular expressions, see .NET Framework Regular Expressions and Regular Expression Examples.

  • 우편 번호가 유효한 미국 우편 번호 여야 하는 경우 우편 번호 웹 서비스를 호출 하 여 사용자가 입력 한 데이터의 유효성을 검사할 수 있습니다.If the postal code must be a valid United States Zip code, you could call a Zip code Web service to validate the data entered by the user.

이벤트 Validating 는 형식의 CancelEventArgs개체를 제공 합니다.The Validating event is supplied an object of type CancelEventArgs. 컨트롤의 데이터가 유효 하지 않은 것으로 확인 되 면이 개체의 Validating Cancel 속성을로 true설정 하 여 이벤트를 취소할 수 있습니다.If you determine that the control's data is not valid, you can cancel the Validating event by setting this object's Cancel property to true. Cancel 속성을 설정 하지 않으면 Windows Forms에서 해당 컨트롤에 대 한 유효성 검사를 완료 한 것으로 가정 하 Validated 고 이벤트를 발생 시킵니다.If you do not set the Cancel property, Windows Forms will assume that validation succeeded for that control, and raise the Validated event.

에서 TextBox전자 메일 주소의 유효성을 검사 하는 코드 예제는를 Validating참조 하십시오.For a code example that validates an email address in a TextBox, see Validating.

데이터 바인딩 및 이벤트 구동 유효성 검사Data Binding and Event-Driven Validation

유효성 검사는 데이터 원본 (예: 데이터베이스 테이블)에 컨트롤을 바인딩한 경우 매우 유용 합니다.Validation is very useful when you have bound your controls to a data source, such as a database table. 유효성 검사를 사용 하 여 컨트롤의 데이터가 데이터 소스에 필요한 형식을 충족 하는지, 안전 하지 않을 수 있는 따옴표 및 백슬래시와 같은 특수 문자를 포함 하 고 있지 않은지 확인할 수 있습니다.By using validation, you can make sure that your control's data satisfies the format required by the data source, and that it does not contain any special characters such as quotation marks and back slashes that might be unsafe.

데이터 바인딩을 사용 하는 경우 Validating 이벤트를 실행 하는 동안 컨트롤의 데이터가 데이터 원본과 동기화 됩니다.When you use data binding, the data in your control is synchronized with the data source during execution of the Validating event. Validating 이벤트를 취소 하면 데이터가 데이터 원본과 동기화 되지 않습니다.If you cancel the Validating event, the data will not be synchronized with the data source.

중요

Validating 이벤트 후에 발생 하는 사용자 지정 유효성 검사를 수행 하는 경우 데이터 바인딩에 영향을 주지 않습니다.If you have custom validation that takes place after the Validating event, it will not affect the data binding. 예를 들어 Validated 이벤트에 데이터 바인딩을 취소 하려고 하는 코드가 있는 경우 데이터 바인딩이 계속 발생 합니다.For example, if you have code in a Validated event that attempts to cancel the data binding, the data binding will still occur. 이 경우 Validated 이벤트에서 유효성 검사를 수행 하려면 컨트롤의 데이터 원본 업데이트 모드 속성 ( (데이터 바인딩) \ (고급) )을 onvalidation 에서 Never로 변경 하 고를 추가 합니다. .DataBindings["유효성 검사 코드에 <> 필드를제어합니다."].WriteValue()In this case, to perform validation in the Validated event, change the control's Data Source Update Mode property (under (Databindings)\ (Advanced)) from OnValidation to Never, and add Control.DataBindings["<YOURFIELD>"].WriteValue() to your validation code.

암시적 및 명시적 유효성 검사Implicit and Explicit Validation

그렇다면 컨트롤의 데이터 유효성을 검사할 때So when does a control's data get validated? 개발자에 게는 사용자가 있습니다.This is up to you, the developer. 응용 프로그램의 요구 사항에 따라 암시적 또는 명시적 유효성 검사 중 하나를 사용할 수 있습니다.You can use either implicit or explicit validation, depending on the needs of your application.

암시적 유효성 검사Implicit Validation

암시적 유효성 검사 방법은 사용자가 입력 한 데이터의 유효성을 검사 합니다.The implicit validation approach validates data as the user enters it. 키를 눌렀을 때 키를 읽어 컨트롤에 데이터를 입력 하거나 사용자가 한 컨트롤에서 입력 포커스를 벗어나 다음으로 이동할 때마다 데이터의 유효성을 검사할 수 있습니다.You can validate the data as the data is entered in a control by reading the keys as they are pressed, or more commonly whenever the user takes the input focus away from one control and moves to the next. 이 방법은 사용자가 작업할 때 데이터에 대 한 즉각적인 피드백을 제공 하려는 경우에 유용 합니다.This approach is useful when you want to give the user immediate feedback about the data as they are working.

컨트롤에 대해 암시적 유효성 검사를 사용 하려면 해당 컨트롤의 AutoValidate 속성을로 true설정 해야 합니다.If you want to use implicit validation for a control, you must set that control's AutoValidate property to true. Validating 이벤트를 취소 하는 경우 컨트롤의 동작은에 AutoValidate할당 한 값에 따라 결정 됩니다.If you cancel the Validating event, the behavior of the control will be determined by what value that you assigned to AutoValidate. 를 할당 EnablePreventFocusChange하면 이벤트 Validated 를 취소 하면 이벤트가 발생 하지 않습니다.If you assigned EnablePreventFocusChange, canceling the event will cause the Validated event not to occur. 입력 포커스는 사용자가 데이터를 유효한 입력으로 변경할 때까지 현재 컨트롤에 그대로 남아 있습니다.Input focus will remain on the current control until the user changes the data to a valid input. EnableAllowFocusChange 할당Validated 한 경우 이벤트를 취소 해도 이벤트가 발생 하지 않지만 포커스는 다음 컨트롤로 계속 변경 됩니다.If you assigned EnableAllowFocusChange, the Validated event will not occur when you cancel the event, but focus will still change to the next control.

속성에를 할당 Disable 하면 암시적 유효성 검사가 수행 되지 않습니다. AutoValidateAssigning Disable to the AutoValidate property prevents implicit validation altogether. 컨트롤의 유효성을 검사 하려면 명시적 유효성 검사를 사용 해야 합니다.To validate your controls, you will have to use explicit validation.

명시적 유효성 검사Explicit Validation

명시적 유효성 검사 접근 방식은 한 번에 데이터의 유효성을 검사 합니다.The explicit validation approach validates data at one time. 저장 단추 또는 다음 링크를 클릭 하는 것과 같은 사용자 동작에 대 한 응답으로 데이터의 유효성을 검사할 수 있습니다.You can validate the data in response to a user action, such as clicking a Save button or a Next link. 사용자 작업이 발생 하면 다음 방법 중 하나를 사용 하 여 명시적 유효성 검사를 트리거할 수 있습니다.When the user action occurs, you can trigger explicit validation in one of the following ways:

  • Validate 호출 하 여 포커스가 손실 될 마지막 컨트롤의 유효성을 검사 합니다.Call Validate to validate the last control to have lost focus.

  • ValidateChildren 호출 하 여 폼 또는 컨테이너 컨트롤의 모든 자식 컨트롤의 유효성을 검사 합니다.Call ValidateChildren to validate all child controls in a form or container control.

  • 사용자 지정 메서드를 호출 하 여 컨트롤의 데이터를 수동으로 유효성 검사 합니다.Call a custom method to validate the data in the controls manually.

Windows Forms 컨트롤에 대 한 기본 암시적 유효성 검사 동작Default Implicit Validation Behavior for Windows Forms Controls

Windows Forms 컨트롤 마다 AutoValidate 속성의 기본값이 다릅니다.Different Windows Forms controls have different defaults for their AutoValidate property. 다음 표에서는 가장 일반적인 컨트롤과 기본값을 보여 줍니다.The following table shows the most common controls and their defaults.

컨트롤Control 기본 유효성 검사 동작Default Validation Behavior
ContainerControl Inherit
Form EnableAllowFocusChange
PropertyGrid 속성이 Visual Studio에서 노출 되지 않음Property not exposed in Visual Studio
ToolStripContainer 속성이 Visual Studio에서 노출 되지 않음Property not exposed in Visual Studio
SplitContainer Inherit
UserControl EnableAllowFocusChange

폼 닫기 및 유효성 검사 재정의Closing the Form and Overriding Validation

컨트롤에 포함 된 데이터가 잘못 되어 컨트롤에서 포커스를 유지 하는 경우 일반적인 방법 중 하나로 부모 폼을 닫을 수 없습니다.When a control maintains focus because the data it contains is invalid, it is impossible to close the parent form in one of the usual ways:

  • 닫기 단추를 클릭 합니다.By clicking the Close button.

  • 시스템 메뉴에서 닫기 를 선택 합니다.By selecting Close in the System menu.

  • 메서드를 Close 프로그래밍 방식으로 호출 합니다.By calling the Close method programmatically.

그러나 경우에 따라 컨트롤의 값이 유효한 지 여부에 관계 없이 사용자가 폼을 닫을 수 있습니다.However, in some cases, you might want to let the user close the form regardless of whether the values in the controls are valid. 폼의 FormClosing 이벤트에 대 한 처리기를 만들어 유효성 검사를 재정의 하 고 잘못 된 데이터가 여전히 포함 된 폼을 닫을 수 있습니다.You can override validation and close a form that still contains invalid data by creating a handler for the form's FormClosing event. 이벤트에서 Cancel 속성을로 false설정 합니다.In the event, set the Cancel property to false. 이렇게 하면 폼이 강제로 닫힙니다.This forces the form to close. 자세한 내용과 예제는 Form.FormClosing를 참조하세요.For more information and an example, see Form.FormClosing.

참고

이러한 방식으로 폼을 강제로 닫으려면 폼의 컨트롤에서 아직 저장 되지 않은 데이터는 모두 손실 됩니다.If you force the form to close in this manner, any data in the form's controls that has not already been saved is lost. 또한 모달 폼은 컨트롤을 닫을 때 컨트롤 내용의 유효성을 검사 하지 않습니다.In addition, modal forms do not validate the contents of controls when they are closed. 컨트롤 유효성 검사를 사용 하 여 포커스를 컨트롤에 잠글 수 있지만 폼 닫기와 관련 된 동작에 대해 걱정 하지 않아도 됩니다.You can still use control validation to lock focus to a control, but you do not have to be concerned about the behavior associated with closing the form.

참고자료See also