TextBox que no acepte caracteres especiales WPF (TextBox WPF does not accept special characters)

1 comentario

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

Ocultar Filas de un DataGrid WPF Con CheckBox (Hidden rows DataGrid WPF)

2 comentarios

En esta entrada podre un articulo sobre como ocultar las filas de un DataGrid, muchas veces tenemos la necesidad de ocultar la informacióndonde se aplican filtros que nos permitan resumirla para una mejor visualización, ya sea a travez de un botón de búsqueda o controles como radio button o checkbox

Existen diferentes formas de realizar estos filtrados alguna de esas formas es utilizando LINQ pero en este caso yo utilizare Styles y DataTriggers de WPF.

El ejemplo que se usara sera como el que se muestra en la imagen:

Oculta1

 

 

 

 

 

 

 

 

Antes de iniciar debemos tener agregada a nuestro proyecto la librería WPFToolkit , la cual contiene el control DataGrid que se usara para el ejemplo

y declararla en la clase donde se utilizara:

  xmlns:toolkit=»http://schemas.microsoft.com/wpf/2008/toolkit»

Lo primero que debemos hacer es crear un estilo para las filas del DataGrid , la declaración es la siguiente :

<toolkit:DataGrid.RowStyle>

</toolkit:DataGrid.RowStyle>

Con estas lineas se esta indicando que crearemos un estilo para las filas del grid.

Ahora pasaremos a crear un estilo,  donde le indicaremos que tipo de estilo sera , le indicamos que es para un DataGridRow

<Style TargetType=»toolkit:DataGridRow»>

</Style>

Una vez declarado el estilo, pasaremos  a declarar un trigger, pero ……

 ¿ Por que un Trigger?

Un Trigger es un disparador, el cual se dispara después de una determinada acción , en el caso del ejemplo utilizaremos un trigger por que queremos que se oculten las filas filas del DataGrid cuando se dispare o cambie el valor de los controles ya sean CheckBox o RadioButton

para mas informacion sobre los triggers pueden consultar este  link para reforzar conceptos.  http://geeks.ms/blogs/oalvarez/archive/2009/07/06/triggers-en-wpf.aspx

ahora se crea el trigger.

WPF nos proporciona 3 tipos de Triggers de los cuales utilizaremos los  DataTriggers.

El multiDataTriggerCondicion es un trigger que se dispara cuando se cumplen las condiciones que le son asignadas, en este caso la primera condicion es que la propiedad Sexo tenga el valor de H y que el control en este caso un CheckBox llamado ckdHombre  declarado  tenga un valor en la propiedad IsChecked de False

se le asignara el valor de Collapsed a la propiedad Visibility del DataGrid.

y se hara lo mismo para el otro CheckBox.

<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding=»{Binding Sexo}» Value=»H» />
<Condition Binding=»{Binding ElementName=ckdHombre, Path=IsChecked}» Value=»False»/>
</MultiDataTrigger.Conditions>
<Setter Property=»Visibility» Value=»Collapsed» />
</MultiDataTrigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding=»{Binding Sexo}» Value=»M» />
<Condition Binding=»{Binding ElementName=ckdMujer, Path=IsChecked}» Value=»False»/>
</MultiDataTrigger.Conditions>
<Setter Property=»Visibility» Value=»Collapsed» />
</MultiDataTrigger>
</Style.Triggers>

Aqui el codigo fuente del Ejemplo

 

Si les sirvio no olviden comentar