2009-05-26 106 views
16

特殊文字の入力を禁止するテキストボックスがあります。テキストボックスに英数字のみを入力する

ユーザーが入力できる

  1. A-Z
  2. -Z
  3. 0-9
  4. スペース

どのように私はこれを行うにはKeyDownイベントを行うことができますか?

+0

あなたがasp.netでこれをしたいですか? – ecleel

+0

私はWPFでそれをしたい – Sauron

+0

興味深い - 以前に削除された選択された回答で質問を見たことがない。 – MusiGenesis

答えて

2
private void _txtPath_KeyDown(object sender, KeyEventArgs e) 
    { 
    if ((e.Key < Key.A) || (e.Key > Key.Z)) 
     e.Handled = true; 
    } 
9

正規表現を使用して、他の文字を除外します。 Char.IsDigit、IsXXXメソッドを使用して、不要な文字を除外します。これを行う方法はたくさんあります。

更新:KeyDownを使用する必要がある場合は、KeyPressedも処理し、obEventArgs.Handled = trueを設定して文字を禁止する必要があるようです。 KeyDown MSDN Pageの例を参照してください。

更新: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/Submitをクリックします。

+0

KeyDownイベントで実行できますか? – Sauron

+3

私はあなたが実際にキー値を=よりも他のオペランドと比較できることを発見しました。ありがとう、非常に便利です! – David

31

KeyDownイベントまたはKeyPressイベントを処理することはこれを行う1つの方法ですが、プログラマは通常、無効なテキストをテキストボックスにコピー&ペーストすることができます。

もう少し良い方法は、TextChangedイベントを処理してそこに問題の文字を取り除くことです。キャレットの位置を追跡し、ボックスのTextプロパティを変更した後にキャレットの位置を適切な場所に再設定する必要があるため、これはもう少し複雑です。

アプリケーションのニーズに応じて、ユーザーが任意のものを入力できるようにして、ユーザーが送信しようとしたときにテキストボックスにフラグを立てます(テキストを赤色にするなど)。

+4

+1は、ユーザーがテキストボックスに「コピー貼り付ける」ことを言います。 – Joel

1

とあなたの正規表現は次のようになります[0-9A-ZA-Z] *英語のみ英数字chracters

2

私はWinFormsのは、あなたが事のまさにこの種を指定することができます利用可能MaskedTextBoxコントロールを持っていることを知ってできるようにします。私はWPFを知らないので、もしそこに利用できるのであれば、私は気にしませんが、もしそうなら、それをしてください。キープレスとイベントでこのすべてのものよりもはるかに簡単で、より堅牢です。

3

TextBoxのTextChangedイベントでフィルタリングを行うことを検討する価値はあると思います。テキスト文字列から無効な文字を取り除く操作を作成できます。これは、KeyDownイベントをブロックするよりもちょっと面倒です。

しかし、WPFの組み込みのKeyDown/Upイベント処理メカニズムをブロックしていないため、これはやり方だと思います。コピー/ペーストは引き続き機能します。より抽象度の高いレベルで作業するので、何が起こっているのかを簡単に把握することができます。

2

これを行う最も簡単な方法は、マスクを指定することによって求めていることを正確に行うためのコントロールを備えた拡張WPFツールキットを含めることです。

http://wpftoolkit.codeplex.com/wikipage?title=MaskedTextBox&referringTitle=Home

必要であれば、あなたが入力しているように、それはまた、テキストボックスにマスクを表示します。

私の英語のための

申し訳ありません

1

英数字のみの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; 
    } 
} 
3

私はこれを銀色の中に突き刺し、こう書いた。

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; 
     } 
    } 
} 
11

ちょうど検索でここに終わるそれらのためのいくつかのコードを追加したい:

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; 
} 

これは、ハンドルがコピー&ペーストして、変更のフィルタであり、中にテキストを変更するようにカーソル位置を保持します真ん中が正しく働く。

コントロール名を取得するために「送信者」を使用して、同じフィルタが必要であると仮定して、この1つの関数を複数のテキストボックスにリンクできるようにします。コントロールのイベントセクションに移動し、TextChangedイベントの関数を手動で選択すると、複数のコントロールをリンクできます。

+1

私はこれを使用して終わった、ありがとう! –

3

カスタム依存プロパティでこれを実現します。どんな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" /> 
0

使用Asp.NET AJAXコントロールツールキット

<%@ 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> 
0
my.Netフレームワーク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; 
     } 
    } 
関連する問題