Программирование мобильных устройств на платформе .NET Compact Framework
Шрифт:
'Конструктор
'-----------
Public Sub New
'Распределить память для нашего объекта StringBuilder и предоставить
'место для нескольких дополнительных рабочих символов по умолчанию
m_sb = New System.Text.StringBuilder(SSNumberLength + 5)
m_inputIsFullValidEntry = False
End Sub
'---------------------------------------------------------------------
'Форматировать
поступающий текст с целью установления его соответствия
'нужному формату:
'
' Формат номера карточки социального страхования: ###-##-####
' символы: 01234567890
'
' [in] inString : Текст, который мы хотим форматировать
' [in/out] selectionStart: Текущая точка вставки в тексте;
' она будет смещаться в связи с удалением
' и добавлением нами символов
'----------------------------------------------------------------------
Private Function formatText_NNN_NN_NNNN(ByVal inString As _
String, ByRef selectionStart As Integer) As String
Const firstDashIndex As Integer = 3
Const secondDashIndex As Integer = 6
'Удалить старые данные и поместить входную строку
'в объект StringBuilder, чтобы мы могли с ней работать.
m_sb.Length = 0
m_sb.Append(inString)
'------------------------------------------------------------
'Просмотреть каждый символ в строке, пока не будет
'достигнута максимальная длина нашего форматированного текста
'------------------------------------------------------------
Dim currentCharIndex As Integer
currentCharIndex = 0
While ((currentCharIndex < m_sb.Length) AndAlso _
(currentCharIndex < SSNumberLength))
Dim currentChar As Char
currentChar = m_sb(currentCharIndex)
If ((currentCharIndex = firstDashIndex) OrElse _
(currentCharIndex = secondDashIndex)) Then
'-------------------------------
'The character needs to be a "-"
'-------------------------------
If (currentChar <> "-"c) Then 'Вставить дефис
m_sb.Insert(currentCharIndex, "-")
'Если мы добавили символ перед точкой вставки,
'она должна быть смещена вперед
If (currentCharIndex <= selectionStart) Then
selectionStart = selectionStart + 1
End If
End If
'Этот
символ годится, перейти к следующему символу
currentCharIndex = currentCharIndex + 1
Else
'-------------------------
'Символ должен быть цифрой
'-------------------------
If (System.Char.IsDigit(currentChar) = False) Then
'Удалить символ
m_sb.Remove(currentCharIndex, 1)
'Если мы добавили символ перед точкой вставки,
'она должна быть смещена назад
If (currentCharIndex < selectionStart) Then
selectionStart = selectionStart - 1
End If
'He увеличивать значение счетчика символов, ибо мы должны
'просмотреть символ, занявший место того символа,
'который мы удалили
Else
'Символ является цифрой, все нормально.
currentCharIndex = currentCharIndex + 1
End If
End If
End While
'Если превышена длина строки, усечь ее
If (m_sb.Length > SSNumberLength) Then
m_sb.Length = SSNumberLength
End If
'Возвратить новую строку
Return m_sb.ToString
End Function
Private m_in_OnChangeFunction As Boolean
Protected Overrides Sub OnTextChanged(ByVal e As EventArgs)
'------------------------------------------------------------------
'Если мы изменим свойство .Text, то будет осуществлен повторный
'вход в обработчик. В этом случае мы не хотим предпринимать никаких
'действий и должны просто выйти из функции без передачи события
'куда-то еще.
'------------------------------------------------------------------
If (m_in_OnChangeFunction = True) Then
Return
End If
'Заметьте, что сейчас мы находимся в функции OnChanged,
'поэтому мы можем обнаружить повторное вхождение (см. код выше)
m_in_OnChangeFunction = True
'Получить текущее свойство .Text
Поделиться с друзьями: