Hoy posteare un ejemplo de una funcionalidad que me fue solicitada, la cual consiste en que un textbox de un formulario en WPF no acepte caracteres esperiales, pero ….
¿ Por que un TEXTBOX no debe aceptar caracteres especiales?
Uno de los incovenientes de ingresar caracteres especiales es cuando estamos trabajando con base de datos, un caso particular que me susedio a mi fue querer ingresar una comilla simple ‘
al textbox y despues mandar el contenido de este a un metodo que inserta datos en la base. como sabran cuando un campo tipo cadena es declarado en SQL se utilizan las comillas simples, entonces al pasar un caracter especial esto hara que en vez de dos comillas simples (una que abre y una que cierre) halla tres , con lo que quedara la cadena abierta.
Existen muchas formas para hacerlo en las cuales se pueden utilizar los eventos del teclado para no dejar escribir dichos caracteres, pero cuando se trabaja con patrones de diseño como MVVM la cosa cambia.
Para el siguiente ejemplo , crearemos un formulario en wpf el cual contendra un boton y un textbox , en este ejemplo utilizaremos un concepto llamado Expresiones Regulares.
para mas informacion sobre expresiones regulares da clia AQUI.
para utilizar Expresiones regulares debemos utilizar la libreria:
using System.Text.RegularExpressions;
Despues de eso creamos una funcion para preguntar si el texto ingresado es alphanumerico, ¿por que alphanumerico? por que los simbolos no son ni letras ni numeros son otro tipo de caracteres.
public bool IsAlphaNumeric(String strToCheck) { Regex objAlphaNumericPattern = new Regex("[^a-zA-Z0-9]"); return !objAlphaNumericPattern.IsMatch(strToCheck); }
La clase Regex en su metodo constructor recibe un patron el cual comparara con la cadena para encontrar lo que necesitamos, en este caso este patron nos retornara verdadero si el contenido de la cadena solo son letras y nos retornara falso si contiene un caracter especial.
Tendremos una propiedad la cual estara Bindeada con el control textbox al cual validaremos que no contenga caracteres alphanumericos.
public string Contenido { get { return contenido; } set { this.contenido = value; if (!IsAlphaNumeric(contenido)) { string stringAux = Regex.Replace(contenido, @"\W", ""); this.contenido = stringAux; } } }
Dentro de la propiedad, en el SET es donde se realizara la magia de comparar el contenido de la cadena que nos da el texbox, preguntamos con el IF si los caracteres ingresados no son alfanumericos (el caracter ! significa negacion)
el string stringAux es una variable que almacenara la nueva cadena
el Regex.Replace remplazara la variable string, por un patron de expresion regular, en este caso @»\W» obtiene todos los caracteres especiales y los remplazara por un espacio en blanco.
Ahora eso no es todo el XAML del textbox debe quedar de la siguiente manera:
<TextBox Height="50" Text="{Binding Contenido, Mode=TwoWay, UpdateSourceTrigger=LostFocus}" BorderBrush="Black" BorderThickness="2"></TextBox>
en la propiedad TEXT bindeamos a la propiedad Contenido , ahora lo mas importante de aqui es el UPDARESOURCETRIGGER que es un trigger que se activara cuando el textbox pierda el Focus.
Esta es la forma que yo utilize para solventar este problema, puede haber muchas maneras, esta es solo una opcion =).
Les dejo el codigo fuente de ejemplo aqui =)
Si te sirvio esto no olvides comentar =) .
Les dejo mas liks de referencia :
www.dotnetperls.com
regular-expressions-in-C-Sharp
net-regex-replace-single-line-matching-unknown
msdn.microsoft.com