21

Visual C#テキストボックスで特定の文字のみを許可するにはどうすればよいですか?ユーザーは次の文字をテキストボックスに入力できる必要があり、それ以外はすべてブロックする必要があります:0-9、+、-、/、*、(、)。

私はこの問題を調べるためにGoogleを使用しましたが、私が得ている唯一の解決策は、アルファベット文字のみを許可するか、数字のみを許可するか、特定の文字を禁止することです。私が欲しいのは、特定の文字を禁止しないことです。コードに入力した文字を除いて、デフォルトですべてを禁止したいと思います。

4

6 に答える 6

31

コメント(および入力した別の回答)で述べたように、テキストボックスでキーダウンまたはキープレスイベントをキャッチするには、イベントハンドラーを登録する必要があります。これは、TextBoxがフォーカスを失ったときにのみTextChangedが起動されるためです。

以下の正規表現を使用すると、許可する文字を一致させることができます

Regex regex = new Regex(@"[0-9+\-\/\*\(\)]");
MatchCollection matches = regex.Matches(textValue);

これは逆になり、許可されていない文字をキャッチします

Regex regex = new Regex(@"[^0-9^+^\-^\/^\*^\(^\)]");
MatchCollection matches = regex.Matches(textValue);

誰かがテキストボックスにテキストを貼り付ける可能性があるため、一致するものが1つあるとは思いません。その場合、textchangedをキャッチします

textBox1.TextChanged += new TextChangedEventHandler(textBox1_TextChanged);
private void textBox1_TextChanged(object sender, EventArgs e)
{
    Regex regex = new Regex(@"[^0-9^+^\-^\/^\*^\(^\)]");
    MatchCollection matches = regex.Matches(textBox1.Text);
    if (matches.Count > 0) {
       //tell the user
    }
}

単一のキー押下を検証します

textBox1.KeyPress += new KeyPressEventHandler(textBox1_KeyPress);
private void textBox1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
    // Check for a naughty character in the KeyDown event.
    if (System.Text.RegularExpressions.Regex.IsMatch(e.KeyChar.ToString(), @"[^0-9^+^\-^\/^\*^\(^\)]"))
    {
        // Stop the character from being entered into the control since it is illegal.
        e.Handled = true;
    }
}
于 2012-09-26T17:32:15.093 に答える
11

KeyDownテキストボックスでイベントをサブスクライブする必要があります。次に、このようなもの:

private void textBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
    if (!char.IsControl(e.KeyChar) 
       && !char.IsDigit(e.KeyChar) 
       && e.KeyChar != '.' && e.KeyChar != '+' && e.KeyChar != '-'
       && e.KeyChar != '(' && e.KeyChar != ')' && e.KeyChar != '*' 
       && e.KeyChar != '/')
    {
        e.Handled = true;
        return;
    }
    e.Handled=false;
    return;
}

知っておくべき重要なことは、Handledプロパティをtrueに変更した場合、キーストロークは処理されないということです。意志に設定しfalseます。

于 2012-09-26T17:33:29.583 に答える
1

おそらく、KeyDownイベントKeyPressイベント、またはKeyUpイベントを使用できます。私は最初にKeyDownイベントを試してみようと思います。

イベント引数のHandledプロパティを設定して、イベントの処理を停止できます。

于 2012-09-26T17:27:26.327 に答える
1

KeyPressedイベントをインターセプトすることは、私の意見では良い固溶体です。RegExpを使用する場合は、トリガーコード文字(32未満のKeyCharなど)に注意してください。

ただし、この方法では、ユーザーがクリップボードからテキストを貼り付けるたびに、範囲外の文字を挿入することができます。残念ながら、これを修正するための正しいクリップボードイベントが見つかりませんでした。

したがって、防水ソリューションはTextBox.TextChangedをインターセプトすることです。短時間、元の範囲外の文字が表示されることがあります。両方を実装することをお勧めします。

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;
}
于 2018-02-02T09:15:36.413 に答える
0

検証イベントIMOの場合、最も簡単な方法は、文字配列を使用してテキストボックスの文字を検証することです。True-反復と検証は特に効率的ではありませんが、簡単です。

または、入力文字列に対してホワイトリスト文字の正規表現を使用します。イベントは、MSDNの次の場所で入手できます: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.lostfocus.aspx

于 2012-09-26T17:31:28.020 に答える
-1
    private void txtuser_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (!char.IsLetter(e.KeyChar) && !char.IsWhiteSpace(e.KeyChar) && !char.IsControl(e.KeyChar))
        {
            e.Handled = true;
        }
    }
于 2016-06-13T10:57:08.290 に答える