'Присоединить эту кнопку к форме. По существу,
'это создаст кнопку на форме!
'---------------------------------------------
newButton.Parent = Me
'Увеличить счетчик в соответствии с созданием очередной кнопки
m_nextNewButtonIndex = m_nextNewButtonIndex + 1
End Sub
'-----------------------------------------------------
'Обработчик событий, который мы динамически подключаем
'к нашим новым кнопкам
'-----------------------------------------------------
Private Sub ClickHandlerForButtons(ByVal sender As Object, _
ByVal e As System.EventArgs)
Dim buttonCausingEvent As Button = _
CType(sender, System.Windows.Forms.Button)
'Вызвать окно сообщений, извещающее о том,
'что мы получили событие
MsgBox("Click event from:" + vbCrLf + buttonCausingEvent.Text)
End Sub
Листинг 13.3. Фильтрующее текстовое окно, принимающее текст в формате ###-##-####Option Strict On
Imports System
'----------------------------------------------------------------------------
'Этот класс является элементом управления, производным от элемента управления
'TextBox.
'Он наследует все графические свойства TextBox, но добавляет фильтрацию
'содержимого текстового окна, тем самым гарантируя,
'что вводимый текст будет соответствовать формату:
'###-##-####.
'Этот формат соответствует формату номеров карточек социального страхования,
'используемых в США.
'-----------------------------------------------------------------------------
Public Class SocialSecurityTextBox
Inherits System.Windows.Forms.TextBox
Private m_inputIsFullValidEntry As Boolean
'------------------------------------------------
'Указывает, получен ли
'номер карточки социального страхования полностью
'------------------------------------------------
Public ReadOnly Property IsFullValidInput() As Boolean
Get
Return m_inputIsFullValidEntry
End Get
End Property
'Объект StringBuilder, которую мы будем часто использовать
Private m_sb As System.Text.StringBuilder
'Максимальная длина обрабатываемых строк
Const SSNumberLength As Integer = 11
'-----------
'Конструктор
'-----------
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