2009-05-26 69 views

Respuesta

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

Utilice una expresión regular para filtrar los demás caracteres. O use los métodos Char.IsDigit, IsXXX para filtrar los caracteres no deseados. Muchas formas de hacer esto.

Actualización: si debe utilizar KeyDown, entonces parece que también necesita manejar KeyPressed y establecer obEventArgs.Handled = true para no permitir los caracteres. Véase el ejemplo de la actualización KeyDown MSDN Page

: Ahora que se especifica que es WPF. El código a continuación permitirá que solo ingresen caracteres a-z y A-Z en el cuadro de texto. Extienda según sea necesario ...

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

Esto se romperá si copia y pega cosas en el cuadro de texto. Valide todo el texto una vez que el usuario abandone el control o cuando haga clic en Aceptar/Enviar como dice MusicGenesis.

+0

¿Se puede hacer en el evento KeyDown? – Sauron

+3

Acabo de descubrir que puedes comparar valores clave con otros operandos que = ... ¡muchas gracias, muy útil! – David

31

Manejo de la KeyDown o eventos de teclas es una manera de hacer esto, pero los programadores suelen olvidar que un usuario puede copiar y pegar texto no válido en el cuadro de texto.

Un poco mejor forma de hacerlo es controlar el evento TextChanged, y tira fuera de cualquier carácter ofensivos allí. Esto es un poco más complicado, ya que debe hacer un seguimiento de la posición de intercalación y volver a establecerla en el lugar apropiado después de cambiar la propiedad Texto del cuadro.

Dependiendo de las necesidades de su aplicación, sólo sería dejar que el tipo de usuario en lo que quieran, y después de la bandera de la caja de texto (convertir el texto en rojo o algo así) cuando el usuario intenta enviar.

+4

+1 para mencionar al usuario "copiar y pegar" en el cuadro de texto. – Joel

1

y su regExp podría parecerse [0-9a-zA-Z] * para permitir que sólo chracters alfanuméricos inglés

2

sé que WinForms tienen disponible un control MaskedTextBox, que le permite especificar exactamente este tipo de cosas. No sé WPF, así que no sé si está disponible allí, pero si lo es, haz eso. Es MUCHO más fácil que todo esto con pulsaciones de teclas y eventos, y también más robusto.

3

creo que vale la pena considerar que realiza el filtrado en el evento TextChanged del cuadro de texto. Puede crear una operación que elimine cualquier carácter no válido de su cadena de texto. Esto es un poco más complicado que bloquear el evento KeyDown.

embargo, creo que este es el camino a seguir, ya que no está bloqueando los mecanismos de manipulación/Arriba eventos incorporados KeyDown de WPF, por lo que copiar/pegar todavía funciona. Trabajarías en un nivel más alto de abstracciones, así que creo que será más fácil averiguar qué está pasando.

2

La forma más sencilla de hacerlo sería incluido el kit de herramientas de WPF extendido que tiene un control para hacer exactamente lo que está pidiendo al especificar una máscara.

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

También mostrará la máscara en el cuadro de texto que está ingresando, si es necesario.

(También tiene muchos otros controles útiles)

1

única alfanumérica TextBox de WPF C#,

Lo siento por mi Inglés .. pero con este código para WPF, C#, que sólo permiten alfanumérica

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

Me encontré con esto en Silverlight y escribí algo como esto.

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

sólo quería añadir algo de código para los que terminan aquí por búsqueda:

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

Se trata de un cambio de filtro, por lo que las manijas copiar y pegar, y preserva la posición del cursor de modo que el cambio de texto en el el medio funciona correctamente

Tenga en cuenta que utiliza el 'remitente' para obtener el nombre del control, permitiendo que esta función se vincule a varios cuadros de texto, suponiendo que necesitan el mismo filtro. Puede vincular varios controles yendo a la sección de eventos de un control y seleccionando manualmente la función para el evento TextChanged.

+1

¡Terminé usando esto, gracias! –

3

Lo logro con una Propiedad de dependencia personalizada. Es reutilizable para cualquier control TextBox, es mucho más rápido y más eficiente de usar que la creación de eventos clave, y hace que mis archivos de código sean mucho más limpios.

Además, puede manejar otros métodos de entrada que no activan eventos clave, como pegar un valor en el TextBox con el mouse.

El código para el encargo DP se ve así:

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

y se usa así:

<TextBox Text="{Binding SomeValue, UpdateSourceTrigger=PropertyChanged}" 
     local:TextBoxHelpers.AllowedCharactersRegex="a-zA-Z0-9\s" /> 
0

Uso AJAX Control Toolkit Asp.NET

<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="asp" %> 

y Uso 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

en el Marco my.Net 4.5 C# aplicación

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