Only allow specific characters in textbox

后端 未结 6 875
走了就别回头了
走了就别回头了 2020-12-01 21:17

How can I only allow certain characters in a Visual C# textbox? Users should be able to input the following characters into a text box, and everything else should be blocked

6条回答
  •  情歌与酒
    2020-12-01 21:39

    Intercept the KeyPressed event is in my opinion a good solid solution. Pay attention to trigger code characters (e.KeyChar lower then 32) if you use a RegExp.

    But in this way is still possible to inject characters out of range whenever the user paste text from the clipboard. Unfortunately I did not found correct clipboard events to fix this.

    So a waterproof solution is to intercept TextBox.TextChanged. Here is sometimes the original out of range character visible, for a short time. I recommend to implement both.

    using System.Text.RegularExpressions;

    private void Form1_Shown(object sender, EventArgs e)
    {
        filterTextBoxContent(textBox1);
    }
    
    
    string pattern = @"[^0-9^+^\-^/^*^(^)]";
    
    private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
    {
        if(e.KeyChar >= 32 && Regex.Match(e.KeyChar.ToString(), pattern).Success) { e.Handled = true; }
    }
    
    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        filterTextBoxContent(textBox1);
    }
    
    private bool filterTextBoxContent(TextBox textBox)
    {
        string text = textBox.Text;
    
        MatchCollection matches = Regex.Matches(text, pattern);
        bool matched = false;
    
        int selectionStart = textBox.SelectionStart;
        int selectionLength = textBox.SelectionLength;
    
        int leftShift = 0;
        foreach (Match match in matches)
        {
            if (match.Success && match.Captures.Count > 0)
            {
                matched = true;
                Capture capture = match.Captures[0];
    
                int captureLength = capture.Length;
                int captureStart = capture.Index - leftShift;
                int captureEnd = captureStart + captureLength;
    
                int selectionEnd = selectionStart + selectionLength;
    
                text = text.Substring(0, captureStart) + text.Substring(captureEnd, text.Length - captureEnd);
    
                textBox.Text = text;
    
                int boundSelectionStart = selectionStart < captureStart ? -1 : (selectionStart < captureEnd ? 0 : 1);
                int boundSelectionEnd = selectionEnd < captureStart ? -1 : (selectionEnd < captureEnd ? 0 : 1);
    
                if (boundSelectionStart == -1)
                {
                    if (boundSelectionEnd == 0)
                    {
                        selectionLength -= selectionEnd - captureStart;
                    }
                    else if (boundSelectionEnd == 1)
                    {
                        selectionLength -= captureLength;
                    }
                }
                else if (boundSelectionStart == 0)
                {
                    if (boundSelectionEnd == 0)
                    {
                        selectionStart = captureStart;
                        selectionLength = 0;
                    }
                    else if (boundSelectionEnd == 1)
                    {
                        selectionStart = captureStart;
                        selectionLength -= captureEnd - selectionStart;
                    }
                }
                else if (boundSelectionStart == 1)
                {
                    selectionStart -= captureLength;
                }
    
                leftShift++;
            }
        }
    
        textBox.SelectionStart = selectionStart;
        textBox.SelectionLength = selectionLength;
    
        return matched;
    }
    

提交回复
热议问题