Выбрать главу

  //достигнута максимальная длина нашего форматированного текста

  //------------------------------------------------------------

  int  currentCharIndex;

  currentCharIndex = 0;

  while ((currentCharIndex < m_sb.Length) && (currentCharIndex < SSNumberLength)) {

   char  currentChar;

   currentChar = m_sb[currentCharIndex];

   if ((currentCharIndex == firstDashIndex) || (currentCharIndex == secondDashIndex))

   //-------------------------------

   //Данным символом должен быть "-"

   //-------------------------------

   {

    if (currentChar != '-') {

     //Вставить дефис

     m_sb.Insert(currentCharIndex, "-");

     //Если мы добавили символ перед точкой вставки,

     //она должна быть смещена вперед

     if (currentCharIndex <= selectionStart) {

      selectionStart++;

     }

    }

    //Этот символ годится, перейти к следующему символу

    currentCharIndex++;

   } else

   //-------------------------

   //Символ должен быть цифрой

   //-------------------------

   {

    if (System.Char.IsDigit(currentChar) == false) {

     //Удалить символ

     m_sb.Remove(currentCharIndex, 1);

     //Если мы добавили символ перед точкой вставки,

     //она должна быть смещена назад

     if (currentCharIndex < selectionStart) {

      selectionStart--;

     }

     //He увеличивать значение счетчика символов, ибо мы должны

     //просмотреть символ, занявший место того символа,

     //который мы удалили

    } else {

     //Символ является цифрой, все нормально.

     currentCharIndex++;

    }

   }

  }

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

  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;

//--------------------------------------------------------------