domingo, 13 de octubre de 2013

[Tip] Obtener todos los controles de un formulario de un tipo en especifico

En muchas ocasiones requerimos buscar todos los controles de un tipo en especifico que tenemos en nuestros formularios, por ejemplo si tenemos muchos TextBox y queremos comparar sus valores sin tener que hacerlo uno a uno, o si por ejemplo agregamos dinamicamente N controles a nuestro formulario o algún contenedor, para lograr esto muchas veces recurrimos a un ciclo que recorra cada control de nuestro formulario y pregunte por su tipo para realizar una acción o no, pues bueno voy a mostrar una forma mucho más sencilla de hacerlo.

En nuestro ejemplo vamos tener N TextBox contenidos en un panel, y el objetivo es validar si algún TextBox tiene un Text repetido con otro:

Primero obtenemos todos los controles de tipo TextBox contenidos en nuestro panel, de la siguiente forma:

var controles = this.pnlControles.Controls.OfType<TextBox>();

Ahora ya tenemos una colección con todos los TextBox que necesitamos, ya podemos realizar las consultas Linq o Lambda que requiramos, en nuestro caso usaremos la siguiente:

if (controles.Count(c => c.Text != string.Empty && c.Text.Equals(c.Text)) >= 2)
                MessageBox.Show("Repetido con otro TextBox");

A través de la Lambda Expression preguntamos si existe un algún TextBox con Text repetido, con esto podemos realizar cualquier tipo de validación que necesitemos.

Eso es todo, espero les sea de utilidad.

Saludos!!

viernes, 11 de octubre de 2013

[Tip] Realizar consultas a través de Lambda Expressions en un DataSet con tablas relacionadas

En muchas de nuestras aplicaciones necesitamos persistir datos en memoria para usarlos a lo largo de la interacción del usuario en muchos ámbitos del sistema, en muchas de estas ocasiones optamos por el uso de los famosos DataSet, en los cuales almacenamos N DataTable, y cuando necesitamos creamos relaciones entre estos para optimizar y realizar consultas sobre ellos con mayor facilidad. por eso vamos a observar como podemos realizar consultas sobre DataTable relacionados a través de Lambda Expressions, y para eso crearemos un DataSet con la siguiente estructura:

            DataTable categorias = new DataTable();
            categorias.Columns.Add("id", typeof(int));

            DataTable productos = new DataTable();
            productos.Columns.Add("id", typeof(int));
            productos.Columns.Add("name", typeof(string));

            for (int i = 1; i < 4; i++)
            {
                categorias.Rows.Add(i);
            }

            Random rd = new Random(DateTime.Now.Millisecond);
            for (int i = 1; i < 11; i++)
            {
                productos.Rows.Add(rd.Next(1, 4), "Name" + i);
            }

            DataSet ds = new DataSet();
            ds.Tables.Add(categorias);
            ds.Tables.Add(productos);
            ds.Relations.Add(categorias.Columns[0], productos.Columns[0]);

Ahora veamos como realizar una consulta filtrando por el campo name:

var likejoin = category.Rows.OfType<DataRow>().Join(product.Rows.OfType<DataRow>(), cat => cat.Field<int>("id"),
prod => prod.Field<int>("id"), (cat, prod) => new { Id = cat.Field<int>("id"),
Nombre = prod.Field<string>("name") }).Where(c => c.Nombre.Contains("ElTavo"));

Observemos que a través de la extensión Join relacionamos las tablas que necesitemos, y debemos especificar la tabla de relación seguido de los campos de llave primaria que relacionaran las tablas, posteriormente especificamos que campos de las tablas vamos a mostrar en el resultado y por ultimo aplicamos la sentencia WHERE en este caso para filtrar los productos cuyo nombre contenga la palabra ElTavo.

Eso es todo, espero les sea de utilidad.

Saludos!!

lunes, 7 de octubre de 2013

[Patrones] - Acceso a datos para soluciones escalables usando sql, No sql y persistencia políglota

Hola amigos, les comparto esta interesante guía publicada por Microsoft para el desarrollo de acceso a datos para soluciones altamente escalables, da a conocer ventajas de las bases de datos No Sql y como se pueden hacer soluciones combinando Sql y No SQL, usando buenas prácticas.

http://msdn.microsoft.com/en-us/library/dn271399.aspx

espero les sea de utilidad.

Saludos!!