2009-11-18 7 views
1
나는 유효한 날짜가 텍스트 상자에 입력되었는지 확인하려면 다음 코드를 사용하고

:유효성 검사 날짜 텍스트 상자

public bool ValidateDate(Control ctrl) 
{ 
    if (!string.IsNullOrEmpty(ctrl.Text)) 
    { 
     DateTime value; 
     if (!DateTime.TryParse(ctrl.Text, out value)) 
     { 
      return false; 
     } 
    } 
    return true; 
} 


private void txtStartDate_Validating(object sender, CancelEventArgs e) 
{ 
    if (Utils.ValidateDate(txtStartDate)) 
    { 
     errorProvider.SetError(txtStartDate, ""); 
    } 
    else 
    { 
     errorProvider.SetError(txtStartDate, "* Invalid Date"); 
     e.Cancel = true; 
    } 
} 

이 m을 입력 날짜에 대해 잘 작동/D/년, 년// yyyy, mm/dd/yy, mm/dd/yyyy. 사용자가 "11/17"과 같은 날짜를 입력하면 유효한 날짜로 평가되지만 유감스럽게도 세 가지 날짜 부분 만있는 날짜 만 필요합니다.

쉬운 방법이 있나요? 필자는 텍스트 상자에 2 "/"가 있는지 확인하는 데 오랜 시간이 걸릴 것이라고 생각했지만 원하는 결과를 얻는 더 깨끗한 방법이 있다고 확신합니다.

편집 : 모든 제안 주셔서 감사합니다! 나는 M/월/일 등을 허용하는 다음 코드를 사용하여 결국 M/D/YY ~

public bool ValidateDate(Control ctrl) 
    {   
     if (!string.IsNullOrEmpty(ctrl.Text)) 
     { 
      string[] formats = {"M/d/yyyy", "M/d/yy"}; 
      DateTime value; 

      if (!DateTime.TryParseExact(ctrl.Text, formats, new CultureInfo("en-US"), DateTimeStyles.None, out value)) 
      { 
       return false; 
      }     
     } 
     return true; 
    } 

답변

6

을 DateTime.TryParseExact (..) 함수를 사용하면 특정 날짜 형식 (예 : "mm/dd/yyyy")을 사용하여 날짜를 구문 분석 할 수 있습니다. 그러나 연도의 자릿수를 유연하게하려면 정규 표현식을 선택하는 것이 좋습니다.

+0

Nice. 나는 TryParseExact에 대해 완전히 잊었다. +1. –

+2

DateTime.TryParseExact()에는 여러 형식을 허용하는 재정의가 있으므로 형식 지정의 유연성을 포기할 필요가 없었습니다. 감사! – Sesame

+0

우수. 나는 그 과부하에 대해 잊어 버렸다. 그게 너에게 효과적이라고 나는 기뻐. –

1

3 개 구성 요소와 데이트 패턴과 일치하는 정규 표현식을 작성하고 대신 날짜 시간의 유효성을 검사하는 것을 사용한다. TryParse. 여기

코드의 샘플 비트입니다 :

if (Regex.IsMatch(ctrl.Text, @"(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d")) 
     { 
      //.... 
     } 
+1

당신이 유연하고 싶은 경우에 대한 국가 별 설정을 고려할지 여부를, 잊지 마세요 DateTime은 dd/mm/yyyy (영국), mm/dd/yyyy (미국) 또는 yyyy/mm/dd 일 수 있으므로 슬래시 구분 기호도 다를 수 있습니다. 이것을 처리하기 위해 cultureinfo 클래스를 사용하십시오 .. – t0mm13b

2

당신은 정규 표현식을 사용하여 시도 할 수 :

Regex dateRegExp = new Regex("^(((0?[1-9]|[12]\d|3[01])[\.\-\/](0?[13578]|1[02])[\.\-\/]((1[6-9]|[2-9]\d)?\d{2}|\d))|((0?[1-9]|[12]\d|30)[\.\-\/](0?[13456789]|1[012])[\.\-\/]((1[6-9]|[2-9]\d)?\d{2}|\d))|((0?[1-9]|1\d|2[0-8])[\.\-\/]0?2[\.\-\/]((1[6-9]|[2-9]\d)?\d{2}|\d))|(29[\.\-\/]0?2[\.\-\/]((1[6-9]|[2-9]\d)?(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)|00|[048])))$"); 

Match m = dateRegExp.Match(dateString); 

if (m.Success) { 
    //Valid Date' 
} 
else 
{ 

    //No soup for you, 1 year' 
} 

(I 여기에서 정규 표현식을 "빌린"RegExpLib를)

+0

+1 // 당신을위한 수프가 없습니다, 1 년 ' – HelloW

1

당신은 좀 더 사용자 친화적 인 MaskedTextBox을 사용할 수 있고 당신을 위해 validation을 수행합니다

private void Form1_Load(object sender, EventArgs e) 
{ 
    maskedTextBox1.Mask = "00/00/0000"; 
    maskedTextBox1.ValidatingType = typeof(System.DateTime); 
} 
+0

일반적으로, 나는 가지고 있지만 ... Telerik의 WinForms 컨트롤을 사용하고 있으며 MaskedEditBox에 너무 많은 문제가 있습니다. 제안 해 주셔서 감사합니다. – Sesame