Как запретить пользователю вводить специальный символ в текстовое поле? - PullRequest
1 голос
/ 12 октября 2011

Я хочу предотвратить ввод или вставку одного конкретного символа * (звездочка) в текстовое поле.

Я пытался:

  1. key_press событие - но оно не обрабатывает случай, когда пользователь вставляет звездочку в текстовое поле.
  2. text_changed событие - но когда я удаляю символ, позиция курсора возвращается к началу текста.

Так что мне интересно, как с этим справиться, желательно в одном случае.

Ответы [ 4 ]

6 голосов
/ 12 октября 2011

используйте событие изменения текста, но сохраните местоположение курсора (свойства SelectionStart и SelectionEnd) перед удалением звездочки, затем заново установите положение курсора (за вычетом количества звездочек, удаленных перед курсором).

    private void textBox1_TextChanged(object sender, TextChangedEventArgs e)
    {
        var currentText = textBox1.Text;
        var selectionStart = textBox1.SelectionStart;
        var selectionLength = textBox1.SelectionLength;

        int nextAsterisk;
        while ((nextAsterisk = currentText.IndexOf('*')) != -1)
        {
            if (nextAsterisk < selectionStart)
            {
                selectionStart--;
            }
            else if (nextAsterisk < selectionStart + selectionLength)
            {
                selectionLength--;
            }

            currentText = currentText.Remove(nextAsterisk, 1);
        }

        if (textBox1.Text != currentText)
        {
            textBox1.Text = currentText;
            textBox1.SelectionStart = selectionStart;
            textBox1.SelectionLength = selectionLength;
        }
    }
2 голосов
/ 12 октября 2011

Этот вопрос может быть вам полезен. То, что вы ищете, выглядит как MaskedTextBox или TextBox с пользовательской логикой проверки. Вы не должны просто стирать символы звездочки при вводе, потому что, если пользователь выбрал текст, а затем набрал звездочку, он заменит выбранный текст звездочкой, прежде чем вы сможете удалить его.

0 голосов
/ 12 октября 2011

Вот решение, которое я нашел: -

На событии Text_oted вот что я делаю: -

txt1.Text = txt1.Text.Replace("*", string.Empty);
txt1.Select(txt1.Text.Length, 0);

Обновленный код: - On Text_changedсобытие: -

int curpos = 0;
        bool isReplaced = false;
        private void txt1_TextChanged(object sender, EventArgs e)
        {
            if (txt1.Text.Contains('*'))
            {
                curpos = txt1.SelectionStart;
                isReplaced = true;
            }
            txt1.Text = txt1.Text.Replace("*", string.Empty);
            if (isReplaced)
            {
                txt1.Select(curpos.Equals(0) ? 0 : curpos -1, 0);
                isReplaced = false;
            }
        }

Итоговый код и протестировано: -

 if (txt1.Text.Contains('*'))
            {
                foreach (char c in txt1.Text)
                    if (c.Equals('*'))
                        barredCharCount += 1;
                curPosition = txt1.SelectionStart;
                isTextReplaced = true;
            }
            txt1.Text = txt1.Text.Replace("*", string.Empty);
            if (isTextReplaced)
            {
                txt1.Select(curPosition.Equals(0) ? 0 : curPosition - barredCharCount, 0);
                isTextReplaced = false;
                curPosition = barredCharCount = 0;
                Console.Beep(); //does not work on 64 bit system
            }

Этот фрагмент кода протестирован и отлично работает ...

0 голосов
/ 12 октября 2011

Вы можете установить положение курсора. Например:

textBox1.SelectionStart = textBox1.Text.Length;

EDIT:

Хорошо, я потратил некоторое время, чтобы написать вам решение, которое работает довольно хорошо. Он сохраняет курсор редактирования в правильном положении, а также покрывает ситуацию, в которой пользователь вставляет несколько символов между символами.

        int position = this.textBox1.SelectionStart;
        string str = this.textBox1.Text;
        int hit = 0;
        for (int i = 0; i < position; i++)
        {
            if (str[i].Equals('*'))
                hit++;

        }
        str = str.Replace("*", "");
        this.textBox1.Text = str;
        this.textBox1.SelectionLength = 0;
        this.textBox1.SelectionStart = position - hit;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...