4

Ctrl- V/ Ctrl-などの特別なキーストロークをブロックせずに、特定の入力キーが TextBox で使用されるのをブロックする最良の方法は何Cですか?

たとえば、ユーザーが A、B、C などの文字または数値のサブセットのみを入力できるようにし、それ以外は何も入力できないようにします。

4

5 に答える 5

3

This is how I handle this usually.

Regex regex = new Regex("[0-9]|\b");            
e.Handled = !(regex.IsMatch(e.KeyChar.ToString()));

That will only allow numerical characters and the backspace. The problem is that you will not be allowed to use control keys in this case. I would create my own textbox class if you want to keep that functionality.

于 2008-11-17T02:03:50.913 に答える
3

winform にはMasked Textboxコントロールを使用しました。それについてのより長い説明があります here . 基本的に、フィールドの条件に一致しない入力は許可されません。数字以外を入力させたくない場合は、単に数字以外を入力できないようにするだけです。

于 2008-11-17T00:46:44.813 に答える
3

キーが許可されていない場合は、keydown-event を使用し、e.cancel を使用してキーを停止します。複数の場所でそれを行いたい場合は、テキスト ボックスを継承するユーザー コントロールを作成し、それを処理するプロパティ AllowedChars または DisallowedChars を追加します。私は時々使用するいくつかのバリアントを用意しています.いくつかはお金のフォーマットと入力を許可し、いくつかは時間の編集などを可能にします.

ユーザー コントロールとしてこれを行う良い点は、それに追加して独自のキラー テキスト ボックスを作成できることです。;)

于 2008-11-17T01:27:53.250 に答える
1

ProcessCmdKey でCtrl- VCtrl- C、 Delete または Backspace のキープレスの事前チェックを行い、それが KeyPress イベントでこれらのキーのいずれでもない場合は、通常の表現。

これはおそらく最善の方法ではありませんが、私の状況ではうまくいきました。

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    // check the key to see if it should be handled in the OnKeyPress method
    // the reasons for doing this check here is:
    // 1. The KeyDown event sees certain keypresses differently, e.g NumKeypad 1 is seen as a lowercase A
    // 2. The KeyPress event cannot see Modifer keys so cannot see Ctrl-C,Ctrl-V etc.
    // The functionality of the ProcessCmdKey has not changed, it is simply doing a precheck before the 
    // KeyPress event runs
    switch (keyData)
    {
        case Keys.V | Keys.Control :
        case Keys.C | Keys.Control :
        case Keys.X | Keys.Control :
        case Keys.Back :
        case Keys.Delete :
            this._handleKey = true;
            break;
        default:
            this._handleKey = false;
            break;
    }
    return base.ProcessCmdKey(ref msg, keyData);
}


protected override void OnKeyPress(KeyPressEventArgs e)
{
    if (String.IsNullOrEmpty(this._ValidCharExpression))
    {
        this._handleKey = true;
    }
    else if (!this._handleKey)
    {
        // this is the final check to see if the key should be handled
        // checks the key code against a validation expression and handles the key if it matches
        // the expression should be in the form of a Regular Expression character class
        // e.g. [0-9\.\-] would allow decimal numbers and negative, this does not enforce order, just a set of valid characters
        // [A-Za-z0-9\-_\@\.] would be all the valid characters for an email
        this._handleKey = Regex.Match(e.KeyChar.ToString(), this._ValidCharExpression).Success;
    }
    if (this._handleKey)
    {
        base.OnKeyPress(e);
        this._handleKey = false;
    }
    else
    {
        e.Handled = true;
    }
    
}
于 2008-12-16T03:20:56.100 に答える
0

テキストボックスに TextChanged イベントを使用できます。

    private void txtInput_TextChanged(object sender, EventArgs e)
    {
        if (txtInput.Text.ToUpper() == "A" || txtInput.Text.ToUpper() == "B")
        {
            //invalid entry logic here
        }
    }
于 2008-11-17T00:19:04.400 に答える