2011-08-18 13 views
3

WinForms 응용 프로그램에서 대화 상자를 만들었습니다. 여기에는 많은 텍스트 상자와 확인/취소 버튼이 있습니다. 사용자가 확인을 클릭하면 모든 항목이 유효하면 대화 상자가 닫히기 만하면됩니다. 각 컨트롤에 대해 "Validating"이벤트를 별도로 수행하는 방법을 알 수 있습니다. 괜찮습니다. 그러나 이들은 컨트롤이 포커스를 잃을 때만 발사되는 것처럼 보입니다. 그러나 대화 상자의 빈 텍스트 상자도 유효하지 않은 입력이므로 사용자가 해당 컨트롤에 집중하지 못했을 수 있습니다. 확인을 클릭하면 모든 컨트롤의 유효성을 검사하는 것을 선호합니다.WinForm에서 데이터 유효성 검사

나는 이렇게하는 방법을 생각할 수 없다. 확인 버튼의 onclick 무시는 창을 닫지 않도록하는 옵션을 갖고 있지 않습니다. 양식 IsClosing 이벤트는 Cancel = true를 설정하여 수행합니다. 그러나 이것은 확인 또는 취소 버튼을 클릭했는지 여부를 구분할 수없는 것 같습니다. 분명히 취소 버튼을 클릭하면 유효성 검사에 신경 쓰지 않고 양식을 닫을 때마다 관계없이 허용 할 수 있습니다.

은 이러한 작업을 수행하기위한 가장 좋은 방법은 무엇입니다]

업데이트 : 이미 내가 확인 버튼을 클릭하면 CausesValidation 해고되지 않습니다 내 양식하고 확인 버튼을하지만 내 검증 이벤트 모두 true로 설정했다. 아래의 해결책으로 제안 된대로 언급합니다.

+0

을 :

private void nameTextBox_Validating(object sender, CancelEventArgs e) { if (nameTextBox.Text.Length == 0) { e.Cancel = true; return; } } 

지금 확인 버튼 동작의 시작 부분에 다음 코드를 추가합니다 T는 귀하의 유효성 검사를 호출 (나는 databinding보고 방법에 의해 바인딩 된 개체의 유효성을 검사) 제안 방법은 확인 버튼에 대한 onclick에 다음 유효성 검사의 양식을 닫지 못하겠습니까? 확인을 클릭하면 양식이 마술로 닫히지 않아야합니다. –

답변

5

> 양식을 선택 true

에 재산 CausesValidation을 설정 OK 버튼을 다시 설정 특성 CausesValidation

true에를 선택하고이 모든 검증을 처리합니다.

중요 포인트 : 1) 당신은 모든 검증 eventhandlers

2) 버튼을 패널에있는 경우 다음 패널을 설정 (또는 true

에 대한 부모 컨트롤의) CausesValidation 특성 필요 e.Cancel=true을 언급해야 편집 :

3) 초점을 잃기 직전에 화재를 확인하십시오. 클릭 할 기본 버튼의 원인이됩니다 Enter 키를 눌러 동안

+0

모두에서 CausesValidation을 true로 설정했는데 확인을 클릭해도 유효성 검사 이벤트가 계속 호출되지 않습니다. 불행히도 이것이 제가 질문 한 전체 이유입니다. – Jonnster

+0

@Jonnster : Button의 모든 부모 컨트롤의 CausesValidation 속성을 true로 설정 했습니까? – Marshal

+0

@Jonnster : 응답 부분의 편집 부분도 참조하십시오. – Marshal

1

당신은이를 사용할 수 있습니다 당신은 OK 버튼 형태의 AcceptButton 속성을 설정 한 경우, 그것은 따라서 유효성 검사의 이벤트가 발생되지 않습니다, 그 버튼에 포커스를 이동하지 않습니다 간단한 코드. hasError라는 간단한 Boolean 변수를 도입하면 작업을 수행 할 수 있습니다.

public partial class Form1 : Form 
    { 
     private bool hasError; 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void OkBtn_Click(object sender, EventArgs e) 
     { 
      errorProvider1.Clear(); hasError=false; 
      if (ValidateTxt.Text.Length == 0) 
      { 
       errorProvider1.SetError(ValidateTxt, "must have a value"); 
       hasError=true; 
      } 
      if (!hasError) 
      { 
       //Do what you want to do and close your application 
       Close(); 
      } 

     } 

     private void CancelBtn_Click(object sender, EventArgs e) 
     { 
      Close(); 
     } 
    } 
1

먼저 텍스트 상자에 유효성 검사 오류가있는 경우 유효성 검사를 취소하십시오. 예를 들어 '왜 수,

if (!ValidateChildren()) 
    return; 

이 폼의 모든 컨트롤에 대한 검증 이벤트를 트리거

관련 문제