0

ユーザーが KeyDown イベントを使用してフォームフィールドに有用なデータのみを入力しようとしたときに、何らかの作業を実行するイベントを発生させようとしています。しかし、KeyDown イベントはどのキーでも機能するため、誤報が発生し続けます。

「Alt、Control、Shift、Esc、Fキーなど」などのボタンでイベントが発生しないようにしています。これを行う最善の方法は何ですか?

私がこれまでに持っているのはこれです:

    private void formControl_KeyModified(object sender, KeyEventArgs e)
    {
        if (e.KeyCode != Keys.Shift && e.KeyCode != Keys.CapsLock && e.KeyCode != Keys.Tab && e.KeyCode != Keys.Escape &&
            e.KeyCode != Keys.Insert && e.KeyCode != Keys.Home && e.KeyCode != Keys.End && e.KeyCode != Keys.PageUp &&
            e.KeyCode != Keys.PageDown && e.KeyCode != Keys.Up && e.KeyCode != Keys.Down && e.KeyCode != Keys.Left &&
            e.KeyCode != Keys.Right && e.KeyCode != Keys.Control && e.KeyCode != Keys.Alt && e.KeyCode != Keys.NumLock &&
            e.KeyCode != Keys.Insert && e.KeyCode != Keys.None && e.KeyCode != Keys.PrintScreen && e.KeyCode != Keys.Help &&
            e.KeyCode != Keys.ControlKey && e.KeyCode != Keys.ShiftKey && e.KeyCode != Keys.Sleep && e.KeyCode != Keys.LWin &&
            e.KeyCode != Keys.RWin && e.KeyCode != Keys.RMenu && e.KeyCode != Keys.LMenu && e.KeyCode != Keys.LShiftKey &&
            e.KeyCode != Keys.RShiftKey && e.KeyCode != Keys.Pause && e.KeyCode != Keys.F1 && e.KeyCode != Keys.F2 &&
            e.KeyCode != Keys.F3 && e.KeyCode != Keys.F4 && e.KeyCode != Keys.F5 && e.KeyCode != Keys.F6 && e.KeyCode != Keys.F7 &&
            e.KeyCode != Keys.F8 && e.KeyCode != Keys.F9 && e.KeyCode != Keys.F10 && e.KeyCode != Keys.F11 && e.KeyCode != Keys.F12 &&
            e.KeyCode != Keys.L)
        {
             // Do some work...
        }
    }

ただし、これを処理するための最良の方法とは思えません。ここでも、テキスト ボックスに入力できる文字(213135udf!@#%@!#@#%15nfaosdf~!@}{:?> など) のキーを取得しようとしています! どんな助けでも大歓迎です、ありがとう!

敬具、Isaac D.

(明確さと品質のために編集されています)

4

5 に答える 5

1

たとえば、 IsLetterOrDigitやその他の関数などのメソッドを使用できるクラスのヘルプについては、このページを確認してください (多くの良い試みがあります) 。Windows フォームを使用しているかどうかを認識できませんでしたか? その場合は、次のような単純なキャストを使用して文字を取得します。Char(char)e.KeyCode

例:

private void formControl_KeyModified(object sender, KeyEventArgs e)
{
    char c = (char)e.KeyCode;
    if (Char.IsLetterOrDigit(c)) {
        // useful
    }
    // might add more checks
    // else if (Char.IsPunctuation(c)) ...
}
于 2011-05-12T20:10:49.227 に答える
1

すべての値を a に投げてHashSet<T>、KeyCode がセット内にあるかどうかを確認できます。

var invalidKeys = new HashSet<Keys> { Keys.Shift, Keys.CapsLock, Keys.Tab, ... Keys.L };
if (!invalidKeys.Contains(e.KeyCode))
{
    // Do some work...
}

または、等価性をチェックしているので、そのすべてを switch ステートメントに入れることもできます。

switch (e.KeyCode)
{
case Keys.Shift:
case Keys.CapsLock:
case Keys.Tab:
// ...
case Keys.L:
    break;
default:
    // Do some work...
    break;
}
于 2011-05-12T20:08:47.773 に答える
0

@Danielがコメントで述べているように、おそらく、有効なキーをホワイトリストに登録する方が、興味のないすべてのキーをブラックリストに登録するよりも望ましいでしょう。したがって、たとえば、文字キーと数字のみに関心がある場合は、msdn Keys の例で説明されているように行うことができます。

if(e.KeyCode > Keys.NumPad0 && e.KeyCode < Keys.NumPad9 ||
   e.KeyCode > Keys.D0 && e.KeyCode < Keys.D9 ||
   e.KeyCode > Keys.A && e.KeyCode < Keys.Z) {

    //do useful stuff here
}
于 2011-05-12T20:55:47.407 に答える
0

フォームのKeyPressイベントを処理できます。上記のイベントは、引数パラメーターとしてKeyPressEventArgsを取ります。

Char.IsLetterOrDigit関数を使用して、 KeyPressEventArgs.KeyCharプロパティの値を確認します。

private void form_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{

     if (char.IsLetterOrDigit(e.KeyChar)) {}
     else { e.Handled = false; }

}

編集:

受け入れられる値のリストを作成してみてChar、preseed 文字が含まれているかどうかを確認することもできます。

private void form_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{

     List<Char> charList = new List<Char>;
     charList.AddRange(new Char[] { 'a', 'b' ... });

     if (charList.Contains(e.KeyChar)) {}
     else { e.Handled = false; }

}

要件を満たすために、両方の方法、またはそれ以上の方法を組み合わせることを検討する必要がある場合があります。

于 2011-05-12T20:12:20.257 に答える
0

if ステートメントの実行時間が気になる場合は、Key 値の SortedList を作成し、SortedList にキーが含まれているかどうかを確認します。

おそらくより良い解決策は、KeyDown イベントを使用するのではなく、Forms TextBox の "TextChanged" イベントを使用することです。

于 2011-05-12T20:12:25.073 に答える