У меня есть текстовое поле, которое должно запрещать ввод каких-либо специальных символов.Разрешено только буквенно-цифровое в текстовом поле
Пользователь может ввести:
- A-Z
- а-г
- 0-9
- Space
Как я могу сделать KeyDown
событие, чтобы сделать это?
У меня есть текстовое поле, которое должно запрещать ввод каких-либо специальных символов.Разрешено только буквенно-цифровое в текстовом поле
Пользователь может ввести:
Как я могу сделать KeyDown
событие, чтобы сделать это?
private void _txtPath_KeyDown(object sender, KeyEventArgs e)
{
if ((e.Key < Key.A) || (e.Key > Key.Z))
e.Handled = true;
}
Используйте регулярное выражение для фильтрации других символов. Или используйте методы 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.
Обработка событий KeyDown или KeyPress - один из способов сделать это, но программисты обычно забывают, что пользователь может по-прежнему копировать и вставлять неверный текст в текстовое поле.
Несколько лучший способ - обработать событие TextChanged и вычеркнуть любые оскорбительные символы. Это немного сложнее, так как вам нужно отслеживать позицию каретки и переустанавливать ее на нужное место после изменения свойства Text в поле.
В зависимости от потребностей вашего приложения, я просто позволю пользователю вводить все, что захочет, а затем отметьте текстовое поле (поменяйте текст красным или что-то еще), когда пользователь попытается отправить.
+1 для обозначения пользователя «копирование вставки» в текстовое поле. – Joel
и ваш РегВыр могут выглядеть следующим образом [0-9a-Za-Z] *, чтобы только английский буквенно-цифрового chracters
Я знаю, что WinForms иметь доступный контроль MaskedTextBox, который позволяет точно указать такие вещи. Я не знаю WPF, поэтому я не знаю, доступно ли это, но если да, сделайте это. Его намного проще, чем все эти вещи с нажатиями клавиш и событиями, и более надежными.
Я думаю, что стоит рассмотреть возможность фильтрации в событии TextChanged TextBox. Вы можете создать операцию, которая избавится от любых недействительных символов из вашей текстовой строки. Это немного более грязно, чем блокирование события KeyDown.
Но, я думаю, это путь, потому что вы не блокируете встроенные механизмы обработки событий KeyDown/Up WPF, поэтому копирование/вставка все еще работает. Вы будете работать на более высоком уровне абстракций, поэтому я думаю, что будет легче выяснить, что происходит.
Самый простой способ сделать это было бы включено Расширенную WPF Toolkit, который имеет контроль за делать именно то, что вы просите, указав маску.
http://wpftoolkit.codeplex.com/wikipage?title=MaskedTextBox&referringTitle=Home
Он будет также отображать маску в текстовом поле, как вы вводите при необходимости.
(Она также имеет много других полезных элементов управления)
только буквенно-цифровой 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;
}
}
Я столкнулся с этим в 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;
}
}
}
Просто хотел, чтобы добавить код для тех, кто в конечном итоге здесь поиск:
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.
Я закончил с этим, спасибо! –
Я выполняю это с помощью специального свойства зависимости. Он многократно используется для любого управления 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" />
Использование 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>
в 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;
}
}
# вы хотите, чтобы это в asp.net? – ecleel
Я хочу это в WPF – Sauron
Интересно - я никогда не видел вопроса с выбранным ответом, который был удален раньше. – MusiGenesis