Разрешить определенные символы в определенных позициях в текстовом поле (vb.net) - PullRequest
1 голос
/ 10 февраля 2010

Например, я только второй символ в каждой строке, чтобы быть х, в то время как 3-й до 10-й символ должен быть шестнадцатеричной цифрой. В данный момент я использую Select Case, затем проверяю положение каретки (используя textbox.selectionstart) и проверяю, является ли нажатая клавиша «легальным» символом.

Есть ли лучший способ сделать это, так как это замедляет работу с большими объемами текста.

Это код, который у меня есть на данный момент:

 Select Case TextBox1.SelectionStart
     Case TextBox1.GetFirstCharIndexOfCurrentLine + 1 
         If Not e.KeyChar = "x" Then
             e.Handled = True
         End If
     Case (TextBox1.GetFirstCharIndexOfCurrentLine + 2) To (TextBox1.GetFirstCharIndexOfCurrentLine + 9) 
         Dim allowedchars As String = "abcdefABCDEF0123456789" & vbCrLf & Chr(Keys.Back)
         If allowedchars.Contains(e.KeyChar) Then
             e.Handled = False
         Else
             e.Handled = True
         End If
 End Select

Ответы [ 4 ]

1 голос
/ 10 февраля 2010

Вы можете просто разрешить вводить что угодно, и , а затем проверить правильность всей строки, используя одно регулярное выражение.Это немного ускорит процесс, особенно на больших объемах текста.

0 голосов
/ 10 февраля 2010

Вы говорите, что это замедляет работу с большими объемами текста; может быть, вызов TextBox1.GetFirstCharIndexOfCurrentLine занимает больше времени при большом количестве текста. Вы называете это три раза, но можете позвонить только один раз:

Dim firstChar As Integer = TextBox1.GetFirstCharIndexOfCurrentLine()

Select Case TextBox1.SelectionStart
    Case firstChar + 1 
        ...
    Case firstChar + 2 To firstChar + 9
        ...
 End Select

Код тоже выглядит чище!

0 голосов
/ 10 февраля 2010

Можете ли вы просто прекратить проверку после 10-го символа?

 If TextBox1.SelectionStart < 11 Then
   ' your code
 End If
0 голосов
/ 10 февраля 2010

Я не уверен в разнице в производительности, но что-то вроде этого может быть быстрее для проверки ваших 1-го и 3-го-9-го персонажей (извиняюсь, если мой VB немного выключен, прошло некоторое время):

If Not Char.IsControl(e.KeyChar) Then    
    Dim test As Int = 0
    Integer.TryParse(e.KeyChar.ToString(), System.Globalization.NumberStyles.HexNumber, Nothing, ByRef test)
    If test = 0 Then
        e.Handled = True
    End If
End if

Редактировать - Забыли контрольный тест Char ...

...