在文本框中仅允许使用字母数字

我有一个文本框,应该禁止输入任何特殊字符。

用户可以输入:

  1. AZ
  2. AZ
  3. 0-9
  4. 空间

如何使KeyDown事件执行此操作?

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

处理KeyDown或KeyPress事件是一种方法,但程序员通常会忘记用户仍然可以将无效文本复制并粘贴到文本框中。

一种更好的方法是处理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; } 

这是一个更改filter,因此处理复制和粘贴,并保留光标位置,以便更改中间的文本正常工作。

请注意,它使用’sender’来获取控件名称,允许将这一个函数链接到多个文本框框,假设它们需要相同的filter。 您可以通过转到控件的事件部分并手动选择TextChanged事件的函数来链接多个控件。

使用正则表达式过滤掉其他字符。 或者使用Char.IsDigit,IsXXX方法过滤掉不需要的字符。 有很多方法可以做到这一点。

更新:如果您必须使用KeyDown,那么您似乎还需要处理KeyPressed并设置obEventArgs.Handled = true以禁止字符。 请参阅KeyDown MSDN页面上的示例

更新:现在您指定它的WPF。 以下代码仅允许在文本框中输入az和AZ字符。 根据需要延长……

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

如果您将内容复制粘贴到文本框中,则会中断。 用户离开控件或单击OK / Submit时,validation整个文本,如MusicGenesis所述。

我认为值得考虑对TextBox的TextChanged事件进行过滤。 您可以创建一个从文本字符串中删除任何无效字符的操作。 这比阻止KeyDown事件更麻烦。

但是,我认为这是要走的路,因为你没有阻止WPF的内置KeyDown / Up事件处理机制,因此复制/粘贴仍然有效。 你会在更高层次的抽象工作,所以我认为更容易弄清楚发生了什么。

我在Silverlight中碰到了这个并写了这样的东西。

 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 ///  /// Lets you enter a RegexPattern of what characters are allowed as input in a TextBox ///  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; } } } 

它的使用方式如下:

  

我知道winForms有一个MaskedTextBox控件,可以让你指定这种东西。 我不知道WPF,所以我不知道那里有没有,但是如果有的话,那就去做吧。 它比使用按键和事件更容易,而且更加强大。

最简单的方法是包含扩展WPF工具包,它可以控制通过指定掩码来完成您要求的操作。

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

如果需要,它还会在您输入时在文本框中显示遮罩。

(它还有许多其他有用的控件)

并且您的regExp看起来像[0-9a-zA-Z] *只允许英文字母数字字符

只有字母数字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; } } 

使用Asp.NET AJAX Control Toolkit

 <%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="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; } }