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

时间:2009-05-26 10:45:54

标签: c# .net wpf regex alphanumeric

我有一个文本框,不允许输入任何特殊字符。

用户可以输入:

  1. A-Z
  2. a-z
  3. 0-9
  4. 空间
  5. 如何让KeyDown事件执行此操作?

13 个答案:

答案 0 :(得分:31)

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

更好的方法是处理TextChanged事件,并在那里删除任何有问题的字符。这有点复杂,因为您必须跟踪插入位置并在更改框的Text属性后将其重新设置到适当的位置。

根据应用程序的需要,我会让用户输入他们想要的内容,然后在用户尝试提交时标记文本框(将文本变为红色或其他内容)。

答案 1 :(得分:18)

只是想通过搜索为这些人添加一些代码:

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

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

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

答案 2 :(得分: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所说的单击确定/提交时验证整个文本。

答案 3 :(得分:3)

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

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

答案 4 :(得分:3)

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

答案 5 :(得分:3)

我使用自定义依赖项属性完成此操作。它可以重用于任何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" />

答案 6 :(得分:2)

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

答案 7 :(得分:2)

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

答案 8 :(得分:2)

最简单的方法是包含扩展WPF工具包,该工具包可以通过指定掩码完全按照您的要求进行控制。

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

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

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

答案 9 :(得分:1)

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

答案 10 :(得分: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;
  }
}

答案 11 :(得分:0)

使用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>

答案 12 :(得分:0)

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