2016-08-05 3 views
0

В vb.net у меня есть следующий код для проверки допустимых символов, которые могут быть введены в текстовое поле.Проверка подлинности текстового поля, переход курсора к началу текста

Private Sub txt_mobile_phone_TextChanged(sender As Object, e As EventArgs) Handles txt_mobile_phone.TextChanged 

    Dim s As String = "" 

    For Each C As Char In txt_mobile_phone.Text 
     If (C >= "0" And C <= "9") OrElse (C = " ") OrElse (C = "-") OrElse (C = "+") Then 
      s &= C 
     End If 

    Next 
    txt_mobile_phone.Text = s 

End Sub 

Проблема заключается в том, что когда кто-то входит недопустимый символ (например, восклицательный знак «!»), Положение курсора, то происходит переход к началу текстовой строки, и все последующие символы вводятся в начале. Есть ли способ сделать это так, чтобы он игнорировал недопустимые символы и продолжал набирать текст с конца строки?

Если это возможно, без использования txt_mobile_phone.SelectionStart = txt_mobile_phone.Text.Length -1 как это означает, что при нажатии на середине строки, чтобы добавить к середине она сломается (который в настоящее время возможно)

+0

Вы не должны обрабатывать событие 'TextChanged' для проверки. Если вы хотите, чтобы пользователь не вводил определенные символы вообще, вы должны обрабатывать «KeyPress», «KeyDown» или «PreviewKeyDown» в зависимости от специфики, и если вы хотите проверить после факта, тогда вы должны обрабатывать 'Validating'. Каждый раз, когда вы устанавливаете свойство «Text», вы сначала уничтожаете то, что было раньше, тем самым теряя позицию каретки, а затем добавляя новый текст. НЕ меняйте «Текст» в обработчике событий «TextChanged». – jmcilhinney

+0

Вы говорите «без использования txt_mobile_phone.SelectionStart = txt_mobile_phone.Text.Length -1'». В любом случае это не сработает, это приведет к поломке программы, как только весь текст будет удален из-за того, что 'SelectionStart' будет 0-1 = -1, и он не может начинаться здесь – David

+0

@jmcilhinney Итак, если я переведу код в 'KeyPress', он решит проблему естественно? –

ответ

0

Вопрос заключается в том, что вы обстреливаете событие на TextChanged, то есть он посреди чего-то. Для вашей цели, для проверки записей, у вас есть событие KeyPress, в котором у вас есть e.Handle для блокировки записей.

Найдите пример ниже, который я применил в своем приложении, чтобы принимать только числовые значения и не должен принимать пробелы;

Private Sub txt_mobile_phone_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txt_mobile_phone.KeyPress, _ 
                               AcEmpNo.KeyPress 
    ' Accept only numeric values 
    If (e.KeyChar < Chr(48) OrElse e.KeyChar > Chr(57)) _ 
    AndAlso e.KeyChar <> Chr(8) Then 
     e.Handled = True 
    End If 

End Sub 

Вы также можете использовать Char-преобразователь, если вы не знаете код;

e.KeyChar = ChrW(Keys.Space) 

Надеюсь, это поможет.

Смежные вопросы