2012-05-12 2 views
0

나는 시도한이 문제를 해결하기 위해 많은 시간을 허비했지만, 성공하지 못했습니다. 내가 필요로하는 모든 텍스트 상자의 유효성을 검사하는 것입니다Keypress ISSUE VB.NET

유효한 체인 :

10% 
0% 
1111111.12% 
15.2% 
10 
2.3 

잘못된 체인 :

.% 
12.% 
.02% 
% 
123456789123.123 

나는 키 누르기 이벤트 지원이 유효 체인 텍스트 상자를 확인해야합니다.

나는 tryed :

Private Sub prices_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles wholeprice_input_new_item.KeyPress, dozenprice_input_new_item.KeyPress, _ 
      detailprice_input_new_item.KeyPress, costprice_input_new_item.KeyPress 

      Dim TxtB As TextBox = CType(sender, TextBox) 
      Dim fullText As String = TxtB.Text & e.KeyChar 
      Dim rex As Regex = New Regex("^[0-9]{1,9}([\.][0-9]{1,2})?[\%]?$ ") 

      If (Char.IsDigit(e.KeyChar) Or e.KeyChar.ToString() = "." Or e.KeyChar = CChar(ChrW(Keys.Back))) Then 
       If (fullText.Trim() <> "") Then 
        If (rex.IsMatch(fullText) = False And e.KeyChar <> CChar(ChrW(Keys.Back))) Then 
         e.Handled = True 
         MessageBox.Show("You are Not Allowed To Enter More then 2 Decimal!!") 
        End If 
       End If 
      Else 
       e.Handled = True 
      End If 
     End Sub 

참고 : 정규식은 옵션 퍼센트 기호 (최대 2 진수 장소 및 9 정수)를 확인해야한다.

나는 성공

+0

오류가 발생했습니다. KeyPress에서 유효성을 검사하고 모든 것을 게시하는 것이 나에게 이상합니다. Javascript'onkeyup'을 사용하여 유효성을 검사 한 다음 서버 측에서 유효성 검사를하지 않는 것이 좋습니다 ** ** 다중 포스트 백과 반대되는 전체 문자열 만 확인 하시겠습니까? –

답변

1

난 당신이 거의 정답을 가지고 있다고 생각하지 않고 문제를 해결하기 위해 노력하고 좌절 느낌 도와주세요. 내가 제공 한 샘플에 대해 정규식을 실행하면 모두 실패합니다. 하지만 정규식 끝 부분에 여분의 공간을 제거하면 예상 된 성공과 실패를 얻게됩니다.

Dim rex As Regex = New Regex("^[0-9]{1,9}([\.][0-9]{1,2})?[\%]?$ ") 

그것은

Dim rex As Regex = New Regex("^[0-9]{1,9}([\.][0-9]{1,2})?[\%]?$") 

편집과 같아야합니다 :

그래서 현재 정규식은 다음과 같습니다

가 좋아 내가 문제를 더 잘 알고 있습니다. 정규 표현식의 문제점은 하나 또는 두 개의 숫자가 오는 경우 마침표 만 허용한다는 것입니다. 다른 사람이 입력을 마친 후에 텍스트 상자 값을 평가하는 경우 제대로 작동합니다. 그러나 코드에서 각 키 누르기를 평가 중이므로 "."기호 뒤에 숫자를 입력 할 기회가 없습니다.

나는이 두 가지 가능한 솔루션

  1. 변경 당신은 아마도 경우에만 정규식을 평가하는 방법을 알아 내려고 노력, 정규 표현식을 평가할 때 유효한 항목으로
  2. 변경 1. 허용하는 정규 표현식을 볼 수 있습니다 사람이 타이핑을 일시 중지했습니다. 당신이 옵션을 1로 갔다 경우

, 그때 우리가 텍스트 문자열로 세 개의 선택적 엔딩을 받아 들일 수 있도록 내가 정규식 변경이

"^[0-9]{1,9}((\.)|(\.[0-9]{1,2}(%)?)|(%))?$" 

처럼 뭔가 정규식을 조정할 필요가 (\.) 수 마침표로 끝나는 문자열 (\.[0-9]{1,2}(%)?)은 한 마침표 또는 두 마침표와 선택적 백분율 기호가 뒤에 오는 문자열을 허용하고 (%)은 백분율 기호로 끝나는 문자열을 허용합니다. 12. %와 같은 것을 허용하고 싶지 않았기 때문에 세 가지 옵션으로 결말을.습니다. 이 작업을 위해 또한 당신은 또한 첫 번째로 퍼센트 기호를 추가해야합니다 if 문

If (Char.IsDigit(e.KeyChar) Or e.KeyChar.ToString() = "." Or e.KeyChar.ToString() = "%" Or e.KeyChar = CChar(ChrW(Keys.Back))) Then 

때문에 정규 표현식이 실행되면 누군가 유형 백분율 기호가.

+0

정규 표현식에서 공백을 제거했지만 여전히 동일한 문제가 있습니다. –

+0

코드를 입력 할 때만 코드가 실패합니까? –

+0

필자에게 쓰기 (.) 할 때의 오류 메시지를 보여줍니다. 예 : 1. –