2009-05-26 3 views
16

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

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

  1. A-Z
  2. а-г
  3. 0-9
  4. Space

Как я могу сделать 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; 
     } 

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

+0

Можно ли это сделать в событии KeyDown? – Sauron

+3

Я только что обнаружил, что вы действительно можете сравнить значения Key с другими операндами, чем = ... спасибо много, очень удобно! – David

31

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

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

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

+4

+1 для обозначения пользователя «копирование вставки» в текстовое поле. – Joel

1

и ваш РегВыр могут выглядеть следующим образом [0-9a-Za-Z] *, чтобы только английский буквенно-цифрового chracters

2

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

3

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

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

2

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

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

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

Это фильтр изменения, поэтому ручки копирования и вставки, и сохраняет позицию курсора, так что при изменении текста в средний работает правильно.

Обратите внимание, что для получения управляющего имени используется функция 'sender', позволяющая связать эту функцию с несколькими полями текстовых полей, предполагая, что им нужен тот же фильтр. Вы можете связать несколько элементов управления, перейдя в раздел событий элемента управления и вручную выбрав функцию для события TextChanged.

+1

Я закончил с этим, спасибо! –

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" /> 
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> 
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; 
     } 
    } 
Смежные вопросы