Литмир - Электронная Библиотека
Содержание  
A
A

   }

  }

  //Если превышена длина строки, усечь ее

  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);

 //Задать родительский объект

152
{"b":"947732","o":1}