2017-11-29 2 views
0

이 프로그램을 작성 중이며 문제가 있습니다.텍스트 상자는 숫자, 문자 및 백 스페이스 만 허용합니다. 텍스트 상자에 입력 한 첫 번째 문자는 숫자가 될 수 없습니다.

그래서 숫자, 문자 및 백 스페이스 만 허용하는 텍스트 상자가 있습니다. 첫 번째 문자는 입력란에 입력 할 수 없습니다. 텍스트 상자의 길이는 최대 6입니다. 텍스트 상자는 추가 문자 또는 사용자 이름의 첫 번째 문자로 입력 된 자를 포함하여 잘못된 문자를 거부합니다.

다음 코드가 있지만 작동하지 않으며 그 이유를 알 수 없습니다.

Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress 

그러나, 당신은 바퀴를 재발견하려는 : 당신이 당신의 KeyPress 이벤트의 핸들 절을 생략했기 때문에

Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) 
    Dim char1 As Char = e.KeyChar 
    If (char1 >= 48 AndAlso char1 <= 57) Then 
     If ((Me.txtUserName.Text.Length = 6) Or Not Me.txtUserName.SelectionStart) Then 
      Interaction.Beep() 
      e.Handled = True 
     End If 
    ElseIf ((char1 >= 97 AndAlso char1 <= 122 OrElse char1 >= 65 AndAlso char1 <= 90)) Then 
     If (Me.txtUserName.Text.Length = 6) Then 
      Interaction.Beep() 
      e.Handled = True 
     End If 
    ElseIf (char1 <> 8) Then 
     Interaction.Beep() 
     e.Handled = True 
    End If 
End Sub 
+0

은 왜 MaskedEdit 컨트롤을 사용하거나 확인하지 사용되는 패턴은 이전에 사용 마스크 예를 약간 다릅니다, 여기에 마스크에 정규식 것과 같습니다 그들이 끝나면 항목? 사용자는 일반적으로 단순한 오타가있는 경우 꾸짖거나 삐 소리가 나는 것과 비슷합니다. – Plutonix

+0

숫자는 ASCII입니다. http://ee.hawaii.edu/~tep/EE160/Book/chap4/subsection2.1.1.1.html – Lee

답변

2

코드가 작동하지 않는 이유를 가장 가능성있는 이유입니다. 나는 기존의 옵션을 사용하도록 제안 할 것이고, 필자가 권장할만한 두 가지 간단한 솔루션이있다. 당신이 지금 뭘 하려는지 인 입력으로

첫 번째 옵션 입력의 유효성을 검사하는 것입니다,이 일의 가장 간단한 방법은 MaskedTextBox 제어를 통해입니다. 이 경우에, 당신은 True로 AsciiOnly Property를 설정합니다 다음이 라인을 따라 뭔가 컨트롤의 Mask property을 설정

Mask: A09999 

마스크의 번역은 다음과 같습니다

A: Required one alphabetical letter (a-z or A-Z). 
0: Required one digit (0-9) 
9: Up to four optional digits (0-9) 

두 번째 옵션은 입력 한 후 입력을 확인하는 것입니다 (예 : 사용자가 "다음" 버튼을 클릭합니다. 과도 함에도 불구하고이 작업을 수행하는 가장 빠른 방법은 RegEx.IsMatch 메서드를 사용하여 입력의 유효성을 검사하는 것입니다.

Dim r As New System.Text.RegularExpressions.Regex("[a-zA-Z]\d{1,5}") 
If r.IsMatch(TextBox1.Text) Then 
    '... proceed 
Else 
    'Invalid input 
End If 

정규식의 번역은 다음과 같습니다 :

[a-zA-Z]: Match any letter a-z regardless of case 
\d{1, 5}: Match atleast one and up to five digits 
+1

좋은 대답! 비록 내가 질문이 있습니다 : 당신은 \ d \ d {0,4}'를 단지'\ d {1,5}'가 아닌 당신의 정규식과 왜 매치시키고 있습니까? –

+0

@VisualVincent - 서둘러 예제를 작성하고 자유 형식으로 입력했지만 좋은 캐치입니다. RegEx를 업데이트하기 위해 내 대답을 편집 할 것입니다. – David

관련 문제