テキストボックス内の有効な文字をロックダウンする
-
05-07-2019 - |
質問
テキストボックス内の有効な文字をロックダウンできるようにする必要があります。現在、各文字を照合できる正規表現があります
[A-Za-z]
アルファ文字のみにロックダウンします。
protected override void OnKeyPress(KeyPressEventArgs e)
{
if (e.KeyChar == (char)Keys.Back)
{
base.OnKeyPress(e);
return;
}
if (String.IsNullOrEmpty(this._ValidCharExpression))
{
base.OnKeyPress(e);
}
else
{
bool isValidChar = Regex.Match(e.KeyChar.ToString(),this._ValidCharExpression).Success;
if (isValidChar)
{
base.OnKeyPress(e);
}
else
{
e.Handled = true;
}
}
}
正規表現コードをOnKeyPressコードに配置しましたが、Ctrl-V、Ctrl-C、Backspaceなどのすべての特殊キーを許可できるようにしました。
ご覧のとおり、バックスペースキーが処理されています。ただし、たとえばCtrl-Vは、ctrlキーに対して1回実行されますが、修飾キーは表示されないため、Vキーは表示されません。
この状況に対処する最善の方法は何ですか?
解決
OnKeyPress / OnKeyUp / OkKeyDownイベントのいずれかを使用してから、Char.IsLetterメソッドを使用して、入力されたキーが文字であることを確認できます。
他のヒント
MaskedTextBox あなたにぴったりかもしれません。
CodeProjctで FilterTextBox を確認することもできます。これを使用して(または説明した方法で)目的を実行できます。基本的な考え方は、変更が表示される前に(OnTextChangingイベントを介して)変更をキャンセルすることです。
OnKeyPressの代わりにOnTextChangedに検証を配置した場合、検証に合格するたびに値を変数に保存するとどうなりますか?その後、ユーザーが間違った文字列を貼り付けたり入力したりすると元に戻すことができます。また、何かが無効であるという他のUIヒントを与えることができます(たとえば、ラベルのテキストを設定します)。
OnTextChangedイベントに有効な文字のチェックを入れないのはなぜですか
次に、Ctrlキーを押しながらCキーを押し、Ctrlキーを押しながらVキーを押します
また、e.ModifierKeys == Keys.Controlを使用して、コントロールキーをテストできます
http://msdn.microsoft.com /en-us/library/system.windows.forms.keypresseventargs.aspx
私が思いついた解決策は、OnKeyDownイベントでキーをチェックし、キー押下を処理する必要がある場合にフラグを設定してから、OnKeyPressイベントでチェックすることです。
protected override void OnKeyDown(KeyEventArgs e)
{
Keys keyCode = (Keys)e.KeyValue;
base.OnKeyDown(e);
if ((e.Modifiers == Keys.Control) ||
(e.Modifiers == Keys.Control) ||
(keyCode == Keys.Back) ||
(keyCode == Keys.Delete))
{
this._handleKey = true;
}
else
{
// check if the key is valid and set the flag
this._handleKey = Regex.Match(key.ToString(), this._ValidCharExpression).Success;
}
}
protected override void OnKeyPress(KeyPressEventArgs e)
{
if (this._handleKey)
{
base.OnKeyPress(e);
this._handleKey = false;
}
else
{
e.Handled = true;
}
}