Windows Forms에서 사용자 입력 유효성 검사

사용자가 애플리케이션에 데이터를 입력하는 경우 애플리케이션에서 해당 데이터를 사용하기 전에 데이터가 유효한지 확인하는 것이 좋습니다. 특정 텍스트 필드의 길이가 0이 아니거나, 필드의 형식이 전화번호 또는 기타 형식의 올바른 데이터로 지정되거나, 문자열에 데이터베이스 보안을 손상시키는 데 사용할 수 있는 안전하지 않은 문자가 포함되지 않도록 요구할 수 있습니다. Windows Forms를 사용하면 여러 방식으로 애플리케이션에서 입력의 유효성을 검사할 수 있습니다.

MaskedTextBox 컨트롤을 사용한 유효성 검사

사용자가 전화 번호 또는 부품 번호와 같은 잘 정의된 형식으로 데이터를 입력하도록 요구해야 하는 경우 MaskedTextBox 컨트롤을 사용하여 최소한의 코드로 빠르게 해당 작업을 수행할 수 있습니다. ‘마스크’는 텍스트 상자의 지정된 위치에 입력할 수 있는 문자를 지정하는 마스킹 언어의 문자로 구성된 문자열입니다. 컨트롤은 사용자에게 프롬프트 세트를 표시합니다. 숫자가 필요할 때 사용자가 문자를 입력하는 것과 같이 사용자가 잘못된 항목을 입력하면 컨트롤은 자동으로 입력을 거부합니다.

MaskedTextBox에 사용되는 마스킹 언어는 매우 유연합니다. 마스킹 언어를 사용하여 필요한 문자, 선택적 문자, 리터럴 문자(예: 하이픈 및 괄호), 통화 문자 및 날짜 구분 기호를 지정할 수 있습니다. 컨트롤은 데이터 소스에 바인딩된 경우에도 잘 작동합니다. 데이터 바인딩의 Format 이벤트를 사용하여 마스크에 맞게 들어오는 데이터의 서식을 다시 지정하고, Parse 이벤트를 사용하여 데이터 필드의 사양에 맞게 나가는 데이터의 서식을 다시 지정할 수 있습니다.

자세한 내용은 MaskedTextBox 컨트롤을 참조하세요.

이벤트 기반 유효성 검사

유효성 검사를 완전히 프로그래밍 방식으로 제어하고자 하거나 복잡한 유효성 검사를 수행해야 하는 경우에는 대부분 Windows Forms 컨트롤에 기본 제공되는 유효성 검사 이벤트를 사용해야 합니다. 자유 형식 사용자 입력을 허용하는 각 컨트롤에는 컨트롤에 데이터 유효성 검사가 필요할 때마다 발생하는 Validating 이벤트가 있습니다. Validating 이벤트 처리 메서드에서 여러 가지 방법으로 사용자 입력의 유효성을 검사할 수 있습니다. 예를 들어 우편 번호를 포함해야 하는 텍스트 상자가 있는 경우 다음 방법으로 유효성 검사를 수행할 수 있습니다.

  • 우편 번호가 특정 우편 번호 그룹에 속해야 하는 경우 입력에서 문자열 비교를 수행하여 사용자가 입력한 데이터의 유효성을 검사할 수 있습니다. 예를 들어 우편 번호가 {10001, 10002, 10003} 집합에 포함되어야 하는 경우 문자열 비교를 사용하여 데이터의 유효성을 검사할 수 있습니다.

  • 우편 번호가 특정 양식에 있어야 하는 경우 정규식을 사용하여 사용자가 입력한 데이터의 유효성을 검사할 수 있습니다. 예를 들어 ##### 또는 #####-#### 양식의 유효성을 검사하기 위해 정규식 ^(\d{5})(-\d{4})?$를 사용할 수 있습니다. A#A #A# 양식의 유효성을 검사하기 위해 정규식 [A-Z]\d[A-Z] \d[A-Z]\d를 사용할 수 있습니다. 정규식에 관한 자세한 내용은 .NET Framework 정규식정규식 예제를 참조하세요.

  • 우편 번호가 유효한 미국 우편 번호여야 하는 경우 우편 번호 웹 서비스를 호출하여 사용자가 입력한 데이터의 유효성을 검사할 수 있습니다.

Validating 이벤트에는 CancelEventArgs형식의 개체가 제공됩니다. 컨트롤의 데이터가 유효하지 않은 것으로 확인하면 해당 개체의 Cancel 속성을 true로 설정하여 Validating 이벤트를 취소할 수 있습니다. Cancel 속성을 설정하지 않으면 Windows Forms는 해당 컨트롤의 유효성 검사가 성공했다고 가정하고 Validated 이벤트를 발생시킵니다.

TextBox에서 이메일 주소의 유효성을 검사하는 코드 예제는 Validating을 참조하세요.

데이터 바인딩 및 이벤트 기반 유효성 검사

유효성 검사는 데이터 소스(예: 데이터베이스 테이블)에 컨트롤을 바인딩한 경우에 매우 유용합니다. 유효성 검사를 사용하여 컨트롤의 데이터가 데이터 소스에 필요한 형식을 충족하며 안전하지 않을 수 있는 따옴표 및 백슬래시와 같은 특수 문자를 포함하지 않는지 확인할 수 있습니다.

데이터 바인딩을 사용하는 경우 컨트롤의 데이터는 Validating 이벤트를 실행하는 동안 데이터 소스와 동기화됩니다. Validating 이벤트를 취소하면 데이터가 데이터 소스와 동기화되지 않습니다.

중요

Validating 이벤트 후에 발생하는 사용자 지정 유효성 검사가 있는 경우 데이터 바인딩에 영향을 주지 않습니다. 예를 들어 데이터 바인딩을 취소하려고 시도하는 Validated 이벤트에 코드가 있는 경우 데이터 바인딩이 계속 발생합니다. 이 경우 Validated 이벤트에서 유효성 검사를 수행하려면 컨트롤의 데이터 원본 업데이트 모드 속성((Databindings)\(고급) 아래)을 OnValidation에서 Never로 변경하고 유효성 검사 코드에 Control.DataBindings["<YOURFIELD>"].WriteValue()를 추가합니다.

암시적 및 명시적 유효성 검사

그러면 컨트롤 데이터의 유효성은 언제 검사합니까? 시기는 개발자가 결정합니다. 애플리케이션의 요구 사항에 따라 암시적 또는 명시적 유효성 검사를 사용할 수 있습니다.

암시적 유효성 검사

암시적 유효성 검사 접근 방식은 사용자가 입력하는 데이터의 유효성을 검사합니다. 데이터가 컨트롤에 입력될 때 눌려진 키를 읽어서 또는 더 일반적으로는 사용자가 입력 포커스를 한 컨트롤에서 벗어나 다음 컨트롤로 이동할 때마다 데이터의 유효성을 검사할 수 있습니다. 이 접근 방식은 작업 중인 데이터에 관한 즉각적인 피드백을 사용자에게 제공하려는 경우에 유용합니다.

컨트롤에 암시적 유효성 검사를 사용하려면 컨트롤의 AutoValidate 속성을 EnablePreventFocusChange 또는 EnableAllowFocusChange로 설정해야 합니다. Validating 이벤트를 취소하면 AutoValidate에 할당한 값에 따라 컨트롤 동작이 결정됩니다. EnablePreventFocusChange를 할당한 경우 이벤트를 취소하면 Validated 이벤트가 발생하지 않습니다. 입력 포커스는 사용자가 데이터를 유효한 입력으로 변경할 때까지 현재 컨트롤에 남아 있습니다. EnableAllowFocusChange를 할당한 경우에는 이벤트 취소 시 Validated 이벤트가 발생하지 않지만 포커스는 계속 다음 컨트롤로 변경됩니다.

AutoValidate 속성에 Disable을 할당하면 암시적 유효성 검사도 수행되지 않습니다. 컨트롤의 유효성을 검사하려면 명시적 유효성 검사를 사용해야 합니다.

명시적 유효성 검사

명시적 유효성 검사 접근 방식은 한 번에 데이터의 유효성을 검사합니다. 저장 단추 또는 다음 링크 클릭과 같은 사용자 작업에 대한 응답으로 데이터의 유효성을 검사할 수 있습니다. 사용자 작업이 발생하면 다음 방법 중 하나로 명시적 유효성 검사를 트리거할 수 있습니다.

  • Validate를 호출하여 포커스가 손실되는 마지막 컨트롤의 유효성을 검사합니다.

  • ValidateChildren를 호출하여 양식 또는 컨테이너 컨트롤에 있는 모든 자식 컨트롤의 유효성을 검사합니다.

  • 사용자 지정 메서드를 호출하여 수동으로 컨트롤에 있는 데이터의 유효성을 검사합니다.

Windows Forms 컨트롤에 대한 기본 암시적 유효성 검사 동작

Windows Forms 컨트롤에 따라 AutoValidate 속성의 기본값이 다릅니다. 다음 표는 가장 일반적인 컨트롤과 기본값을 보여 줍니다.

제어 기본 유효성 검사 동작
ContainerControl Inherit
Form EnableAllowFocusChange
PropertyGrid Visual Studio에서 공개되지 않는 속성
ToolStripContainer Visual Studio에서 공개되지 않는 속성
SplitContainer Inherit
UserControl EnableAllowFocusChange

양식 닫기 및 유효성 검사 재정의

컨트롤에 포함된 데이터가 잘못되어 컨트롤에서 포커스가 유지되는 경우에는 다음과 같은 일반적인 방법 중 하나로 부모 양식을 닫을 수 없습니다.

  • 닫기 단추 클릭

  • 시스템 메뉴에서 닫기를 선택

  • 프로그래밍 방식으로 Close 메서드 호출

그러나 경우에 따라 컨트롤의 값이 유효한지와 관계없이 사용자가 양식을 닫게 하는 것이 좋습니다. 양식의 FormClosing 이벤트에 대한 처리기를 만들어 유효성 검사를 재정의하고 잘못된 데이터를 포함하는 양식을 닫을 수 있습니다. 이벤트에서 Cancel 속성을 false로 설정합니다. 이렇게 하면 양식이 강제로 닫힙니다. 자세한 내용과 예제는 Form.FormClosing를 참조하세요.

참고

이 방식으로 양식을 강제로 닫으면 아직 저장되지 않은 양식의 컨트롤에 있는 데이터가 모두 손실됩니다. 또한 모달 양식은 닫힐 때 컨트롤 콘텐츠의 유효성을 검사하지 않습니다. 컨트롤 유효성 검사를 사용하여 컨트롤에 대한 포커스를 잠글 수 있지만 양식 닫기와 관련된 동작에 관해 걱정하지 않아도 됩니다.

참고 항목