2012-05-12 2 views
0

Я потратил много часов, пытаясь решить эту проблему, которую я пытался, без успеха. Все, что мне нужно, чтобы проверить текстовое поле:Keypress ISSUE VB.NET

Правильных Цепи:

10% 
0% 
1111111.12% 
15.2% 
10 
2.3 

инвалидных Цепи:

.% 
12.% 
.02% 
% 
123456789123.123 

Мне нужно, чтобы проверить текстовое поле с этими действительными цепями, поддерживая событие нажатия клавиши.

я судимый:

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})?[\%]?$") 

EDIT:

Ok Я понимаю, что вопрос больше. Проблема с регулярным выражением состоит в том, что он будет обеспечивать только период, за которым следует одно или два числа. Это отлично работает, если вы оцениваете значение текстового поля после того, как кто-то закончил печатать. Но в вашем коде вы оцениваете для каждого нажатия клавиши, так что у вас нет возможности ввести число после «.».

Я вижу два возможного решения

  1. Изменить регулярное выражение, чтобы 1. как действительный вход
  2. Изменения при оценке регулярного выражения, возможно, пытаюсь выяснить способ только оценить регулярное выражение когда человек приостановил ввод текста.

Если вы пошли с опцией 1, то необходимо настроить регулярное выражение что-то вроде этого

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

Я изменил регулярное выражение так, что он будет принимать три дополнительных окончаний к текстовой строке (\.) позволит строка, заканчивающаяся за период, (\.[0-9]{1,2}(%)?) позволит строке заканчивать период, за которым следует один или два числа, и необязательный знак процента, а (%) позволит строке заканчиваться знаком процента. Я разбил финал на три варианта, потому что я не хотел допускать, чтобы что-то вроде 12.% было действительным. Также для этой работы вам необходимо будет также добавить знак процента ваш первый Если заявление

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. –