Member 13777741 Ответов: 2

Ограничение использования символов в текстовом поле


- Эй!

У меня сейчас небольшая проблема. У меня есть проект winforms, и я хочу ограничить использование символов в определенных текстовых полях только буквами и обратными пространствами.

Используя приведенный ниже пример кода, он действительно обнаруживает числа и правильно очищает поле, но есть две проблемы, с которыми я сталкиваюсь:

1. MessageBox показывает дважды, один раз, когда он обнаруживает номер и один раз, когда он опустошает текстовое поле

2. Backspaces не допускаются, даже если я добавлю \b

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

private void textBox_Ansprechpartner_Name_TextChanged(object sender, EventArgs e)
{
    if (!System.Text.RegularExpressions.Regex.IsMatch(textBox_Ansprechpartner_Name.Text, "^[a-zA-Z ]"))
    {
        MessageBox.Show("This textbox may only contain letters.");
        textBox_Ansprechpartner_Name.Text = string.Empty;
    }            
}

2 Ответов

Рейтинг:
7

OriginalGriff

Во - первых, это неприятный бит пользовательского интерфейса-очищать все, потому что он сделал незначительную ошибку, довольно неприятно, а во-вторых, потому что он не будет работать так, как есть.
Если я наберу "A123345!"£$%^&*(" is примет его, потому что он начинается с допустимого символа.

Вы можете исправить его так, чтобы он работал и очень легко принимал только буквы и пробелы:

if (!System.Text.RegularExpressions.Regex.IsMatch(textBox_Ansprechpartner_Name.Text, "^[a-zA-Z ]*$"))
Но я бы посмотрел на сохранение предыдущей версии:
private string lastEntry = "";
private void textBox_Ansprechpartner_Name_TextChanged(object sender, EventArgs e)
    {
    if (!System.Text.RegularExpressions.Regex.IsMatch(textBox_Ansprechpartner_Name.Text, "^[a-zA-Z ]*$"))
        {
        int loc = textBox_Ansprechpartner_Name.SelectionStart;
        MessageBox.Show("This textbox may only contain letters.");
        textBox_Ansprechpartner_Name.Text = lastEntry;
        textBox_Ansprechpartner_Name.SelectionStart = loc;
        }
    lastEntry = textBox_Ansprechpartner_Name.Text;
    }


Member 13777741

Большое вам спасибо за Ваш вклад!
Действительно, имеет смысл не удалять все, когда кто-то проскальзывает, хотя то, что вы предложили, имеет ту же проблему, если я начну с буквы, я могу ввести все, что хочу после этого. Как мне это обойти?

OriginalGriff

Проверьте регулярное выражение и сравните его с тем, что есть в моем коде...

Member 13777741

Я как изменил свой, так и нагло скопировал ваш-чтобы посмотреть, не ошибся ли я - и результат одинаков для обоих-

OriginalGriff

Это странно - когда я тестирую его, я набираю "abc1" и получаю MessageBox на " 1 " и нигде больше.

Проверьте, что он компилируется чисто - выполните полную перестройку и проверьте панель "список ошибок", чтобы убедиться в отсутствии ошибок, а затем используйте отладчик, чтобы проверить, что он выполняет правильный код.

Member 13777741

Неважно, я просто очень, очень глупа. Ваш код работает просто отлично, извините меня.

OriginalGriff

У всех нас бывают такие дни! :смеяться:

Рейтинг:
2

User 7429338

1. MessageBox отображается дважды, потому что TextChanged запускается при назначении строки.Пустой. Вы можете временно отменить назначение обработчика TextChanged перед очисткой, а затем восстановить его.

2. в вашем примере вы можете нажать клавишу backspace, которая удалит текст слева от курсора, а затем снова вызовет TextChanged. Если он не пуст, он должен был быть действителен раньше, и, удалив символ, он все еще должен быть.
Может быть, вы могли бы прояснить эту проблему?