Разрешить только цифры в текстовом поле
У меня есть текстовое поле, которое должно запретить ввод любых специальных символов.
пользователь может ввести :
- A-Z
- a-z
- 0-9
- пробел
Как я могу сделать KeyDown
событие для этого?
13 ответов
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;
}
это фильтр изменений, поэтому обрабатывает копирование и вставку и сохраняет позицию курсора, чтобы изменение текста в середине работало правильно.
обратите внимание, он использует 'отправитель', чтобы получить имя элемента управления, что позволяет функции быть связан с несколькими TextBox с коробки, предполагая, что им нужен один и тот же фильтр. Можно связать несколько элементов управления, перейдя в раздел событий элемента управления и вручную выбор функции для события TextChanged.
используйте регулярное выражение для фильтрации других символов. Или используйте Char.IsDigit, IsXXX методы для фильтрации нежелательных символов. Много способов сделать это.
Update: если вы должны использовать KeyDown, то кажется, что вам также нужно обрабатывать нажатие клавиш и устанавливать obEventArgs.Handled = true, чтобы запретить символы. См. пример на KeyDown MSDN страница
Update: теперь, когда вы указали, что это 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.
Я думаю, что стоит рассмотреть возможность фильтрации события TextChanged TextBox. Вы можете создать операцию, которая позволяет избавиться от любых недопустимых символов из текстовой строки. Это немного более грязно, чем блокировка события KeyDown.
но я думаю, что это путь, потому что вы не блокируете встроенные механизмы обработки событий KeyDown/Up WPF, поэтому копирование/вставка все еще работает. Вы будете работать на более высоком уровне абстракций, поэтому я думаю, что будет легче выяснить, что происходит.
я столкнулся с этим в 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
control, намного быстрее и эффективнее в использовании, чем создание ключевых событий, и делает мои файлы кода намного чище.
кроме того, он может обрабатывать другие методы ввода, которые не вызывают ключевые события, такие как вставка значения в текстовое поле с помощью мыши.
код для пользовательского 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" />
Я знаю, что winForms имеют доступный элемент управления MaskedTextBox, который позволяет указать именно такие вещи. Я не знаю WPF, поэтому я не знаю, доступно ли это там, но если это так, сделайте это. Его намного проще, чем все это с нажатиями клавиш и событиями, и более надежным.
самый простой способ сделать это-включить расширенный инструментарий WPF, который имеет элемент управления для выполнения именно того, что вы просите, указав маску.
http://wpftoolkit.codeplex.com/wikipage?title=MaskedTextBox&referringTitle=Home
Он также будет отображать маску в текстовом поле, как вы, вводят при необходимости.
(Он также имеет много других полезных элементов управления)
и ваше регулярное выражение может выглядеть как [0-9a-zA-Z]* разрешить только английские буквенно-цифровые символы
только буквенно-цифровое текстовое поле 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
<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>
in 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;
}
}