如何防止用户在文本框中输入特殊字符?

时间:2011-10-12 13:47:54

标签: c# winforms

我想阻止将一个特定字符*(星号)输入或粘贴到文本框中。

我试过了:

  1. key_press事件 - 但是当用户将星号粘贴到文本框时它不会处理。
  2. text_changed事件 - 但是当我删除字符时,光标位置会回到文本的开头。
  3. 所以我想知道如何处理它,最好是在一个事件中。

4 个答案:

答案 0 :(得分:6)

使用文本更改事件,但在删除星号之前保存光标的位置(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;
        }
    }

答案 1 :(得分:2)

This question可能对您有用。您正在寻找的似乎是MaskedTextBox或具有自定义验证逻辑的TextBox。您不应该在输入时简单地删除星号字符,因为如果用户选择了文本,然后键入星号,他们将在您有机会删除它之前用星号替换所选文本。

答案 2 :(得分:0)

您可以设置光标位置。例如:

textBox1.SelectionStart = textBox1.Text.Length;

修改

好的,我花了一些时间给你写一个非常好的解决方案。它将编辑光标保持在正确的位置,并且还涵盖用户在字符之间粘贴一些*字符的情况。

        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;

答案 3 :(得分:0)

以下是我找到的解决方案: -

在Text_changed事件中,我正在做的是: -

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

更新了代码: - 在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
            }

这段代码经过测试并且工作正常......