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

标签 c# winforms

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

我试过了:


key_press事件-但是,当用户将星号粘贴到文本框中时,它不会处理这种情况。
text_changed事件-但是,当我删除字符时,光标位置会回到文本的开头。


所以我想知道如何处理它,最好是在一次事件中。

最佳答案

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

关于c# - 如何防止用户在文本框中输入特殊字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7741095/

相关文章:

c# - ListBlob 在 microsoft.azurestorage 的函数列表中不可见

c# - 哪些密码用于加密 ASP.NET Web.config 文件的部分?

c# - SSRS 报告中令人讨厌的 NULL 复选框

c# - 如何重新同步 Visual Studio 2008 Windows 窗体设计器?

c# - 强制 WaitCursor 到模态窗体的父窗体

c# - 保持 Form.BackgroundImage 在高对比度模式下可见

c# - 依赖属性是类级别或对象级别

c# - 在带有 SSL 的 C# 中使用 WebClient,因此无法嗅探流量

C# IDisposable 模式和抛出 ObjectDisposedException

.net - 使用 BindingSource 很慢?