特殊文字の入力を禁止するテキストボックスがあります。
ユーザーは次のように入力できます。
これを行うためにKeyDown
イベントを作成するにはどうすればよいですか?
KeyDownまたはKeyPressイベントの処理はこれを行う1つの方法ですが、プログラマは通常、ユーザーが無効なテキストをテキストボックスにコピーアンドペーストできることを通常は忘れます。
やや良い方法は、TextChangedイベントを処理し、そこで問題のある文字をすべて取り除くことです。キャレットの位置を追跡し、ボックスのTextプロパティを変更した後、キャレットの位置を適切な場所に再設定する必要があるため、これは少し複雑です。
アプリケーションのニーズに応じて、ユーザーが何でも入力できるようにし、ユーザーが送信しようとしたときにテキストボックスにフラグを付ける(テキストを赤または何かに変える)。
検索でここに到達するコードをいくつか追加したかっただけです。
private void Filter_TextChanged(object sender, EventArgs e)
{
var textboxSender = (TextBox)sender;
var cursorPosition = textboxSender.SelectionStart;
textboxSender.Text = Regex.Replace(textboxSender.Text, "[^0-9a-zA-Z ]", "");
textboxSender.SelectionStart = cursorPosition;
}
これは変更フィルターであるため、コピーと貼り付けを処理し、カーソル位置を保持して、中央のテキストの変更が適切に機能するようにします。
「sender」を使用してコントロール名を取得することに注意してください。同じフィルターが必要であると想定して、この1つの関数を複数のテキストボックスボックスにリンクできます。コントロールのイベントセクションに移動し、TextChangedイベントの関数を手動で選択することにより、複数のコントロールをリンクできます。
正規表現を使用して、他の文字を除外します。または、Char.IsDigit、IsXXXメソッドを使用して、不要な文字を除外します。これを行う方法はたくさんあります。
更新:KeyDownを使用する必要がある場合は、KeyPressedも処理し、obEventArgs.Handled = trueを設定して文字を禁止する必要があるようです。 KeyDown MSDNページの例を参照してください
更新:これでWPFが指定されました。以下のコードでは、テキストボックスにa-zおよびA-Z文字のみを入力できます。必要に応じて拡張...
private void _txtPath_KeyDown(object sender, KeyEventArgs e)
{
if ((e.Key < Key.A) || (e.Key > Key.Z))
e.Handled = true;
}
これをテキストボックスにコピーアンドペーストすると壊れます。ユーザーがコントロールを離れたとき、またはMusicGenesisが言うように、ユーザーが[OK /送信]をクリックしたときに、テキスト全体を検証します。
TextBoxのTextChangedイベントでフィルタリングを行うことを検討する価値があると思います。テキスト文字列から無効な文字を取り除く操作を作成できます。これは、KeyDownイベントをブロックするよりも少し厄介です。
しかし、WPFの組み込みのKeyDown/Upイベント処理メカニズムをブロックしていないので、これが適切な方法であると思います。したがって、コピー/貼り付けは引き続き機能します。あなたはより高いレベルの抽象化で作業しているので、何が起こっているのかを理解するのは簡単だと思います。
私はこれにシルバーライトで遭遇し、このようなものを書きました。
private string _filterRegexPattern = "[^a-zA-Z0-9]"; // This would be "[^a-z0-9 ]" for this question.
private int _stringMaxLength = 24;
private void _inputTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
if (!string.IsNullOrEmpty(_filterRegexPattern))
{
var text = _inputTextBox.Text;
var newText = Regex.Replace(_inputTextBox.Text, _filterRegexPattern, "");
if (newText.Length > _stringMaxLength)
{
newText = newText.Substring(0, _stringMaxLength);
}
if (text.Length != newText.Length)
{
var selectionStart = _inputTextBox.SelectionStart - (text.Length - newText.Length);
_inputTextBox.Text = newText;
_inputTextBox.SelectionStart = selectionStart;
}
}
}
これは、カスタムの依存関係プロパティを使用して実現します。これは、すべてのTextBox
コントロールで再利用でき、キーイベントを作成するよりもはるかに高速で効率的に使用できます。また、コードファイルをよりすっきりさせます。
さらに、マウスを使用して値をTextBoxに貼り付けるなど、キーイベントをトリガーしない他のインプットメソッドも処理できます。
カスタムDPのコードは次のようになります。
// When set to a Regex, the TextBox will only accept characters that match the RegEx
/// <summary>
/// Lets you enter a RegexPattern of what characters are allowed as input in a TextBox
/// </summary>
public static readonly DependencyProperty AllowedCharactersRegexProperty =
DependencyProperty.RegisterAttached("AllowedCharactersRegex",
typeof(string), typeof(TextBoxProperties),
new UIPropertyMetadata(null, AllowedCharactersRegexChanged));
// Get
public static string GetAllowedCharactersRegex(DependencyObject obj)
{
return (string)obj.GetValue(AllowedCharactersRegexProperty);
}
// Set
public static void SetAllowedCharactersRegex(DependencyObject obj, string value)
{
obj.SetValue(AllowedCharactersRegexProperty, value);
}
// Events
public static void AllowedCharactersRegexChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
var tb = obj as TextBox;
if (tb != null)
{
if (e.NewValue != null)
{
tb.PreviewTextInput += Textbox_PreviewTextChanged;
DataObject.AddPastingHandler(tb, TextBox_OnPaste);
}
else
{
tb.PreviewTextInput -= Textbox_PreviewTextChanged;
DataObject.RemovePastingHandler(tb, TextBox_OnPaste);
}
}
}
public static void TextBox_OnPaste(object sender, DataObjectPastingEventArgs e)
{
var tb = sender as TextBox;
bool isText = e.SourceDataObject.GetDataPresent(DataFormats.Text, true);
if (!isText) return;
var newText = e.SourceDataObject.GetData(DataFormats.Text) as string;
string re = GetAllowedCharactersRegex(tb);
re = string.Format("[^{0}]", re);
if (Regex.IsMatch(newText.Trim(), re, RegexOptions.IgnoreCase))
{
e.CancelCommand();
}
}
public static void Textbox_PreviewTextChanged(object sender, TextCompositionEventArgs e)
{
var tb = sender as TextBox;
if (tb != null)
{
string re = GetAllowedCharactersRegex(tb);
re = string.Format("[^{0}]", re);
if (Regex.IsMatch(e.Text, re, RegexOptions.IgnoreCase))
{
e.Handled = true;
}
}
}
そしてそれは次のように使用されます:
<TextBox Text="{Binding SomeValue, UpdateSourceTrigger=PropertyChanged}"
local:TextBoxHelpers.AllowedCharactersRegex="a-zA-Z0-9\s" />
これを行う最も簡単な方法は、マスクを指定して正確に要求されていることを実行するためのコントロールを持つ拡張WPFツールキットを含めることです。
http://wpftoolkit.codeplex.com/wikipage?title=MaskedTextBox&referringTitle=Home
必要に応じて入力しているときに、テキストボックスにマスクも表示されます。
(また、他にも多くの便利なコントロールがあります)
WinFormsにはMaskedTextBoxコントロールが用意されているので、この種のことを正確に指定できます。 WPFがわからないので、WPFが利用できるかどうかはわかりませんが、利用できる場合はそれを実行してください。キープレスとイベントを備えたこのすべてのものよりはるかに簡単で、より堅牢です。
英数字のTextBox WPF C#のみ、
申し訳ありませんが、このWPF、c#のコードでは、英数字のみを許可します
private void txtTraslado_TextChanged(object sender, KeyEventArgs e)
{
if (((e.Key < Key.NumPad0)||(e.Key > Key.NumPad9))&&((e.Key < Key.A)||(e.Key > Key.Z)))
{
e.Handled = true;
}
}
そして、あなたのregExpは[0-9a-zA-Z] *のようになり、英語の英数字のみを許可します
Asp.NETを使用AJAX Control Toolkit
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="asp" %>
FilteredTextBoxExtenderを使用します
<asp:TextBox ID="txt_gpf_no" runat="server" CssClass="textbox"
MaxLength="10"></asp:TextBox>
<asp:FilteredTextBoxExtender ID="FilteredTextBoxExtender_gpf_no" runat="server" Enabled="True"
TargetControlID="txt_gpf_no" FilterType="UppercaseLetters,LowercaseLetters,Custom" ValidChars="1234567890 ">
</asp:FilteredTextBoxExtender>
my.Net Framework 4.5 C#アプリケーション
private void txtRF_Register_Val_KeyDown(object sender, KeyEventArgs e)
{
//only enable alphanumeric
if (!(((e.KeyCode < Keys.NumPad0) || (e.KeyCode > Keys.NumPad9)) && ((e.KeyCode < Keys.A) || (e.KeyCode > Keys.E))))
{
e.SuppressKeyPress = false;
}
else
{
e.SuppressKeyPress = true;
}
}