}
}
//Если превышена длина строки, усечь ее
if (m_sb.Length > SSNumberLength) {
m_sb.Length = SSNumberLength;
}
//Возвратить новую строку
return m_sb.ToString();
}
bool m_in_OnChangeFunction;
protected override void OnTextChanged(EventArgs e) {
//------------------------------------------------------------------
//Если мы изменим свойство .Text, то будет осуществлен повторный
//вход в обработчик. В этом случае мы не хотим предпринимать никаких
//действий и должны просто выйти из функции без передачи события
//куда-то еще.
//------------------------------------------------------------------
if (m_in_OnChangeFunction == true) {
return;
}
//Заметьте, что сейчас мы находимся в функции OnChanged,
//поэтому мы можем обнаружить повторное вхождение (см. код выше)
m_in_OnChangeFunction = true;
//Получить текущее свойство .Text
string oldText = this.Text;
//Получить текущий индекс
SelectionStart int selectionStart = this.SelectionStart;
//Форматировать строку, чтобы она удовлетворяла нашим потребностям
string newText = formatText_NNN_NN_NNNN(oldText, ref selectionStart);
//Если текст отличается от исходного, обновить
//свойство .Text
if (System.String.Compare(oldText, newText) != 0) {
//Это приведет к повторному вхождению
this.Text = newText;
//Обновить местоположение точки вставки
this.SelectionStart = selectionStart;
}
//Мы принудительно обеспечили соответствие введенного текста
//правильному формату, поэтому, если длина строки согласуется с длиной
//номера карточки социального страхования, то мы знаем что она имеет
//формат ###-##-####.
if (this.Text.Length == SSNumberLength) {
//Да, мы имеем полный номер карточки социального страхования
m_inputIsFullValidEntry = true;
} else {
//Нет, мы пока не получили полный номер карточки социального страхования
m_inputIsFullValidEntry = false;
}
//Вызвать наш базовый класс и сообщить всем объектам, которых это
//может интересовать, что текст изменился
base.OnTextChanged(e);
//Заметьте, что сейчас мы покидаем наш код и хотим отключить
//проверку повторных вхождений в него.
m_in_OnChangeFunction = false;
}
protected override void OnKeyPress(System.Windows.Forms.KeyPressEventArgs e) {
//Поскольку нам известно, что никакие буквы при вводе нам не нужны,
//то просто игнорировать их, если они встречаются.
char keyPressed = e.KeyChar;
if (System.Char.IsLetter(keyPressed)) {
//Сообщить системе о том, что событие обработано
e.Handled =true;
return;
}
//Обработать нажатие клавиши обычным способом
base.OnKeyPress(e);
} //Конец функции
} //Конец класса
Листинг 13.4 Код формы для создания пользовательского элемента управления TextBox
//-----------------------------------------------------------------
//Переменная для хранения нашего нового элемента управления TextBox
//-----------------------------------------------------------------
SocialSecurityTextBox m_filteredTextBox;
//--------------------------------------------------------------
//ОБРАБОТЧИК СОБЫТИЙ: Создать экземпляр нашего пользовательского
// элемента управления и поместить его в форму
//--------------------------------------------------------------
private void button1_Click(object sender, System.EventArgs e) {
//Создать, позиционировать и разместить элемент управления
m_filteredTextBox = new SocialSecurityTextBox();
m_filteredTextBox.Bounds = new System.Drawing.Rectangle(2, 2, 160, 20);
//Подключить обработчик событий
m_filteredTextBox.TextChanged += new EventHandler(this.textBox_TextChanged);
//Задать родительский объект