3

C#WinFormでカスタムターミナルを作成しています。ユーザーが使用しているキーを押すとき、TextBoxそれが有効なキーであることを確認する必要があります。私は彼らがものを削除して彼らが望むことを何でもすることができないようにする必要があります。KeyPressKeyDownイベントを介してバックスペースと削除などを処理することができました。shiftユーザーが+を押すのに問題がありましたdelete。のように削除しbackspaceます。それと同等の整数が何であるかわかりません。私はそれを検出するためにC++プログラムを作成しました、それは簡単でした:

char c = _getch();
cout << (int)c << endl;

私は-32を得ました。C#では機能しませんでした。

何度もその値を囲んでみたところ、0であることがわかりました。少なくとも昨日は機能しましたが、現在は機能していません。Shift+Deleteで削除することもできます。

これが私の主要な検証方法です。

private bool IsInvalidKey(char key)
{
  bool condition1 = !IsAsciiKey(key) && !IsNavigatingKey(key); // by navigation I mean: left, right, end and home keys.
  bool condition2 = (GetCaretPosition() == CaretPosition.OutsideCommandLine && !IsNavigatingKey(key));
  bool condition3 = ((key == (char)Keys.Back) && GetCaretPosition() == CaretPosition.BeginningOfCommandLine);
  return (condition1 || condition2 || condition3);
}

private bool IsAsciiKey(char key)
{
  return ((int)key > 0 && (int)key <= 127); // char(0) should be shift+delete
}

このキーと場所(どのイベントで、KeyPressまたはKeyDown?)を検出するにはどうすればよいですか?

ではなく、通常のTextBoxコントロールを使用していRichTextBoxます。

4

2 に答える 2

4

KeyDownイベントでこのようなことを試すことができます。

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Shift && e.KeyCode == Keys.Delete) e.Handled = true;
}
于 2012-09-10T17:57:14.163 に答える
4

KeyDownイベントを使用して個々のキーを確認するのではなく、実際に行う必要があるのは、TextChangedイベントですべての検証を行うことです。また、エントリ全体(最後の文字だけでなく)を毎回検証する必要があります。何かが変わる。これは、ユーザーが実行できる可能性のあるすべてをサポートする唯一の方法です。例として、ユーザーはマウスを使用してテキストボックス内のテキストを切り取ったり貼り付けたりすることができますが、これはキー押下イベントをまったくトリガーしません。

必要に応じて、キー押下イベント処理して、無効な文字/キーが最初にテキストを変更するのを防ぐ(そして完全な検証を引き起こす)のを防ぐことができますが、これは基本的に、フィールドのクライアント側の検証を実行するのと同じです。ウェブページ; それはいいことですが、それを回避できるので、それを使用するだけではありません。

于 2012-09-10T17:59:24.970 に答える