Дополнение числа начальными нулями с помощью события TextChanged в текстовом поле

1

У меня есть. Net приложение с простым text box которое пользователю необходимо добавить с номером до 15 цифр. Если число Length меньше 15, я хочу добавить перед номером ввода Leading Zeros. Например, если пользователь вставляет номер 1002 я хочу, чтобы text box автоматически добавляло 000000000001002 поэтому я пытаюсь это сделать через text box TextChanged event:

private void radTextBoxNum_TextChanged(object sender, EventArgs e)
{
    string str = "";
    if (radTextBoxNum.Text.Length < 15)
    {
        int currentlength = radTextBoxNum.Text.Length;
        int addZeroes = 15 - radTextBoxNum.Text.Length;
        for (int i = 0; i < addZeroes; i++)
        {
            str += "0";
        }
    }

    string val = radTextBoxNum.Text;
    radTextBoxNum.Text = "";
    radTextBoxNum.Text = str + val;
}

Поэтому моя проблема в том, что после вставки одного номера я получил эту ошибку:

Необработанное исключение типа "System.StackOverflowException" произошло в System.Windows.Forms.dll

  • 0
    Обработчик событий изменяет текст в текстовом поле, поэтому он запускается бесконечно, пока не произойдет переполнение запасов, то есть вы не можете изменить текст TextBox в его обработчике событий TextChanged.
  • 0
    Так что я могу сделать это автоматически, пока пользователь вводит номера?
Теги:

2 ответа

0
Лучший ответ

Вы можете сделать это в событии TextChanged, если вы предотвращаете изменения, происходящие внутри события, от вызова события снова, что и вызвало ваше исключение StackOverflowException.

private void radTextBoxNum_TextChanged(object sender, EventArgs e) {
  radTextBoxNum.TextChanged -= radTextBoxNum_TextChanged;
  string text = radTextBoxNum.Text.TrimStart('0');
  radTextBoxNum.Text = text.PadLeft(15, '0');
  radTextBoxNum.Select(radTextBoxNum.TextLength, 0);
  radTextBoxNum.TextChanged += radTextBoxNum_TextChanged;
}

Вместо удаления и добавления обработчика вы можете выполнить это с помощью простой переменной уровня формы. Кроме того, было бы лучше разместить код в Try... Catch... Наконец, где вы добавите обработчик обратно в блок finally, точно так же, как предосторожность против чего-то не так.

0

Это потому, что ваша длина текста постоянно изменяется, и, таким образом, int addZeroes = 15 - radTextBoxNum.Text.Length постоянно увеличивается.

Вы будете сталкиваться с проблемами, если используете событие TextChanged. Попробуйте вместо этого использовать Validated событие (когда поле выходит):

private void radTextBoxNum_Validated(object sender, EventArgs e)
{
    radTextBoxNum.Text = radTextBoxNum.Text.PadLeft(15, '0');
}
  • 1
    Может изменить цикл while на String.PadLeft (15, '0'). Циклические строковые операции являются дорогостоящими.
  • 1
    Может использовать radTextBoxNum.Text = newValue.PadLeft(15, '0');
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню