User13839404
User13839404

Reputation: 1813

How to prevent user to enter a special character in text box?

I want to prevent one particular character * (asterisk) from being entered or pasted into a text box.

I tried:

  1. key_press event - but it does not handle the case when user pastes an asterisk to the text box.
  2. text_changed event - but when I remove the character, the cursor position goes back to the beginning of the text.

So I am wondering how to handle it, preferably in one event.

Upvotes: 1

Views: 5905

Answers (4)

User13839404
User13839404

Reputation: 1813

Here is the solution i found:-

On Text_changed event, here is what i am doing:-

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

Updated code:- On Text_changed event:-

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;
            }
        }

Final code and Tested :-

 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
            }

This piece of code is tested and working perfectly...

Upvotes: 0

mike
mike

Reputation: 550

You can set the cursor postion. For example:

textBox1.SelectionStart = textBox1.Text.Length;

EDIT:

Ok i took some time to write you a solution that works quite good. It keeps the edit cursor at the proper position and also covers the situation in which user pastes some * chars between chars.

        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;

Upvotes: 0

McKay
McKay

Reputation: 12604

use the text changed event, but save the location of the cursor (the SelectionStart and SelectionEnd properties) before you remove the asterisk, then re set the cursor position (less the number of asterisks removed before the cursor).

    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;
        }
    }

Upvotes: 6

Sion Sheevok
Sion Sheevok

Reputation: 4217

This question may be of use to you. What you're looking for seems like either a MaskedTextBox or a TextBox with custom Validation logic. You should not simply erase an asterisk characters when it is input, because if a user has selected text, then typed an asterisk, they will have replaced the selected text with an asterisk before you have the chance to remove it.

Upvotes: 2

Related Questions