Подтвердить что ты не робот

Разрешить только буквенно-цифровое в текстовом поле

У меня есть текстовое поле, которое должно запрещать ввод каких-либо специальных символов.

Пользователь может ввести:

  • A-Z
  • a-z
  • 0-9
  • Space

Как я могу сделать событие KeyDown для этого?

4b9b3361

Ответ 1

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

Ответ 2

Обработка событий KeyDown или KeyPress - один из способов сделать это, но программисты обычно забывают, что пользователь может по-прежнему копировать и вставлять недопустимый текст в текстовое поле.

Несколько лучший способ - обработать событие TextChanged и вычеркнуть там любые оскорбительные символы. Это немного сложнее, так как вам нужно отслеживать позицию каретки и переустанавливать ее в соответствующее место после изменения свойства "Текст".

В зависимости от ваших потребностей приложения, я просто позволю пользователю вводить все, что захочет, а затем отметьте текстовое поле (поменяйте текст красным или что-то еще), когда пользователь попытается отправить.

Ответ 3

Просто хотел добавить код для тех, которые заканчиваются поиском:

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' для получения управляющего имени, позволяя связать эту функцию с несколькими полями текстовых полей, предполагая, что им нужен тот же фильтр. Вы можете связать несколько элементов управления, перейдя в раздел событий элемента управления и вручную выбрав функцию для события TextChanged.

Ответ 4

Используйте регулярное выражение для фильтрации других символов. Или используйте методы 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;
      }

Это приведет к поломке, если вы скопируете файлы в текстовое поле. Проверяйте весь текст после того, как пользователь покидает элемент управления или когда он нажимает OK/Submit, как говорит MusicGenesis.

Ответ 5

Думаю, стоит подумать о том, чтобы сделать фильтрацию в событии TextBox TextChanged. Вы можете создать операцию, которая избавится от любых недействительных символов из вашей текстовой строки. Это немного более беспорядочно, чем блокирование события KeyDown.

Но я думаю, что это путь, потому что вы не блокируете встроенные механизмы обработки событий KeyDown/Up WPF, поэтому копирование/вставка все еще работает. Вы будете работать на более высоком уровне абстракций, поэтому я думаю, что будет легче выяснить, что происходит.

Ответ 6

Я столкнулся с этим в 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;
        }
    }
}

Ответ 7

Я выполняю это с помощью специального свойства зависимостей. Он многократно используется для любого элемента управления 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" />

Ответ 8

Я знаю, что у winForms есть элемент управления MaskedTextBox, который позволяет вам точно указать именно на это. Я не знаю WPF, поэтому я не знаю, если это доступно, но если да, сделайте это. Его намного проще, чем все это с помощью клавиш и событий, а также более надежными.

Ответ 9

Самый простой способ сделать это - включить Extended WPF Toolkit, который имеет контроль за тем, что вы просите, указав маску.

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

Он также отобразит маску в текстовом поле при вводе, если потребуется.

(Он также имеет много других полезных элементов управления)

Ответ 10

и ваш regExp может выглядеть как [0-9a-zA-Z] *, чтобы разрешать только английские буквенно-цифровые фрагменты

Ответ 11

только буквенно-цифровой TextBox WPF С#,

извините за мой английский.. но с этим кодом для WPF, С#, я разрешаю только буквенно-числовые

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

Ответ 12

Использовать инструментарий управления 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>

Ответ 13

в приложении my.Net Framework 4.5 С#

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