Primo Chalice Ответов: 2

Как добавить дефисы в разных позициях текстового поля при вводе?


Привет,

Мне нужно текстовое поле с вводом ISBN, где я буду вводить цифры и, соответственно, дефисы (-) будут появляться через определенные промежутки времени. Если быть точным, то я хочу, чтобы он был в следующем формате:

123-4-56-789123-4

Я не хочу использовать MaskedTextBox, потому что он всегда отображает дефисы(-) даже перед вводом. Я хочу, чтобы это было больше похоже на то, когда вводятся ключи продукта, дефисы(-) появляются автоматически.

Пожалуйста помочь.

С уважением
Аман Чаурасия

Что я уже пробовал:

Я пробовал использовать MaskedTextBox, но это не так хорошо.

2 Ответов

Рейтинг:
1

Richard MacCutchan

Добавьте обработчик событий для захвата TextChanged событие. Получить существующий текст из TextBox и отформатируйте его в соответствии с вашими правилами, а затем установите его обратно на дисплей. Не забудьте отключить это событие во время внесения изменений.


Рейтинг:
0

OriginalGriff

Чтобы добавить к тому, что предлагает Ричард, само форматирование не является сложным:

private string ToISBNFormat(string s)
    {
    StringBuilder result = new StringBuilder(13 + 4);
    s = Regex.Replace(s, "-", "");
    int len = s.Length;
    if (len < 3) return s;
    result.AppendFormat("{0}-", s.Substring(0, 3));
    len -= 3;
    if (len >= 1) result.AppendFormat("{0}-", s[3]);
    len -= 1;
    if (len > 0) result.AppendFormat("{0}-", s.Substring(4, Math.Min(2, len)));
    len -= 2;
    if (len > 0) result.AppendFormat("{0}-", s.Substring(6, Math.Min(6, len)));
    len -= 6;
    if (len > 0) result.Append(s.Substring(12, Math.Min(1, len)));
    return result.ToString();
    }
Возможно, Вам также придется поработать с позицией курсора: вы можете получить и установить ее с помощью свойства TextBox.SelectionStart


Primo Chalice

Итак, должен ли я использовать свойство SelectionStart в самом событии TextChanged? Потому что я пытался вызвать fucntion в событии TextChanged и даже использовал SelectionStart, но это не сработало.

OriginalGriff

Как вы его использовали? Я не вижу твоего экрана!

Primo Chalice

частная строка ToISBNFormat(строка s)
{
Результат StringBuilder = новый StringBuilder(13 + 4);
ы = регулярное выражение.Заменить(с, "-", "");
тип int лен = С. Длина;
if (len < 3) return s;
результат.AppendFormat("{0}-", s.Substring(0, 3));
лен -= 3;
если (len >= 1) результат.AppendFormat("{0}-", s[3]);
лен -= 1;
если (len > 0) результат.AppendFormat("{0}-", s.Substring(4, Math.Min(2, len)));
лен -= 2;
если (len > 0) результат.AppendFormat("{0}-", s.Substring(6, Math.Min(6, len)));
лен -= 6;
если (len > 0) результат.Добавить(С. Подстрока(12, Математика.Мин(1, лен)));
возвращаемый результат.Метод toString();
}

частная txt_BookISBN_TextChanged недействительным(объект отправителя, EventArgs в электронной)
{
ToISBNFormat(txt_BookISBN.Text);
txt_BookISBN.Сосредоточить();
}

OriginalGriff

Когда вы начинаете задавать вопросы о сложных предметах линейного пользовательского ввода шаблонов, мы склонны предполагать, что вы знаете основы.
Что ваш код делает с результатом, который возвращает функция?

Primo Chalice

Судя по вашим словам, я считаю, что совершил глупую ошибку или промах. Прошу прощения, если я вас чем-то рассердил. Но я серьезно не собирался этого делать.

В принципе, код ничего не делает. Вход такой же, как и раньше. Обычный текст. Никакого форматирования.

OriginalGriff

"Глупая ошибка" - О да!
Это основной материал - если вы не используете значение, возвращаемое методом, то оно выбрасывается. Таким образом, вызов метода для переформатирования входной строки, а затем игнорирование его возвращаемого значения - переформатированной строки - ничего не сделает с вашей программой ...