krizztorres
Usuario (El Salvador)

Esta vez les traigo un ejemplo de como sumar los datos de una lista obviamente la lista tiene que tener valores numéricos. Aprenderemos como llenar una lista, como imprimir los valores de la lista, y como ya lo dije antes veremos como sumar todos los datos de la lista. Veamos el código. #------------------------------------------------------------------------------- # Name: Sumar Datos de Una Lisa # # Author: Cristian Torres #------------------------------------------------------------------------------- class Lista: lista = [] suma = 0 def llenarlista(self): x= int (raw_input("Ingrese Tamaño De La Lista:")) for i in range(x): #llenar lista self.lista.append(int(raw_input("Ingrese Numero:"))) #imprimir lista for i in self.lista: print i def sumar(self): for i in self.lista: self.suma+= i print "La Suma De Los Datos Es:",self.suma obj = Lista() obj.llenarlista() obj.sumar() Linea 6 empezamos creando una clase. Linea 7 declaramos la lista vacía. Linea 8 declaramos la variable suma que nos servirá para sumar los datos Linea 9 creamos un método que se encargara de llenar la lista. Linea 11-13 llenamos la lista según el tamaño que aya indicado el usuario. Linea 15 y 16 recorremos la lista e imprimimos los datos. Linea 18 creamos un método que servirá para sumar los datos de la lista. Linea 19-21 recorremos la lista para sumar los datos en la variable suma, y luego la imprimimos. Linea 23 creamos una instancia de nuestra clase Lista. Linea 24 y 25 invocamos los 2 métodos que hemos creado. También puedes encontrarlo en mi blog Blog
Hola taringeros nuevamente por aquí con un nuevo post cortesía de Codemania esta vez veremos algo mas que todo para los que empiezan a programar ya que entender las estructuras de control es de las primeras cosas que tenemos que aprender. Instrucción if La instrucción if selecciona una instrucción para ejecución en base al valor de una expresión Boolean. Sintaxis if (condición) { instrucciones } else { instrucciones } Ejemplo using System; namespace UsoIf { class UsoIf { public static void Main() { Console.WriteLine("ingrese un numero entre 1 y 3"); int num = int.Parse(Console.ReadLine()); if (num == 1) { Console.WriteLine("valor es 1"); } else if (num == 2) { Console.WriteLine("valor es 2"); } else if (num == 3) { Console.WriteLine("valor es 3"); } else { Console.WriteLine("no se encontro el valor"); } Console.ReadKey(); } } } Es un simple ejemplo donde pedimos el ingreso de un numero que este en el rango de 1 y 3 luego comparamos si el valor ingresado es 1 2 o 3 para cada opcion muestra su respectivo mensaje y si no esta entre el rango 1 y 3 muestra un mensaje también. Instrucción Switch La instrucción switch es una instrucción de control que controla múltiples selecciones y enumeraciones pasando el control a una de las instrucciones case de su cuerpo. Sintaxis switch (expresion) { case constante 1: instruciones case constante 2: instrucciones default; instrucciones break; } Ejemplo Aremos el mismo ejemplo de la instrucción if. using System; namespace EstructurasdeControl { class UsoSwitch { public static void Main() { Console.WriteLine("ingrese un numero entre 1 y 3"); int num = int.Parse(Console.ReadLine()); switch (num) { case 1: Console.WriteLine("valor es 1"); break; case 2: Console.WriteLine("valor es 2"); break; case 3: Console.WriteLine("valor es 3"); break; default: Console.WriteLine("no se encontro el valor"); break; } Console.ReadKey(); } } } Igual que el ejemplo anterior primero pedimos el ingrese de un numero entre 1 y 3 y luego comparamos que numero ingreso el usuario utilizando la instrucción case. Instrucción While La instrucción while ejecuta una instrucción o un bloque de instrucciones repetidamente hasta que una expresión especificada se evalúa como false. Sintaxis while(condicion) { condiciones incremento,decremento } Ejemplo using System; namespace UsoWhile { class UsoWhile { public static void Main() { Console.WriteLine("ingrese un numero"); int num1 = int.Parse(Console.ReadLine()); Console.WriteLine("ingrese un numero mayor que el anterior"); int num2 = int.Parse(Console.ReadLine()); while (num1 < num2) { Console.WriteLine("valores:" + num1); num1++; } Console.ReadKey(); } } } Primero se pide el ingreso de 2 números, luego se evalúa si el primer numero es menor que el segundo y si lo es imprime la cantidad de números que hay de diferencia entre los 2 empezando desde el valor del primer numero hasta un numero antes que el segundo numero. Instrucción Do While Su diferencia básica con el ciclo while es que la prueba de condición es hecha al finalizar el ciclo, es decir las instrucciones se ejecutan cuando menos una vez porque primero ejecuta las instrucciones y al final evalúa la condición. Sintaxis do { instrucciones incremento,decremento } while(condicion); Ejemplo using System; namespace UsoDoWhile { class UsoDoWhile { public static void Main() { string secreta; string palabra; Console.WriteLine("ingrese la palabra secreta"); secreta = Console.ReadLine(); do { Console.WriteLine("vuelva a introducir la palabra secreta"); palabra = Console.ReadLine(); if (palabra != secreta) Console.WriteLine("palabra incorrecta"); } while (palabra != secreta); Console.WriteLine("Palabra Correcta"); Console.ReadKey(); } } } En este ejemplo Primero solicitamos el ingreso de una palabra secreta, luego solicitamos que vuelva a introducir la palabra secreta, si no ingresa la palabra correcta mostrara un mensaje y el bucle se dejara de ejecutar hasta que introduzca. la palabra correcta. Si quieren descargar el codigo fuente de todos los ejemplos lo pueden hacer desde mi blog. http://cristiantorresalfaro.blogspot.com/2012/04/estructuras-de-control-c.html Y no les olvide pasar por Codemania dejar sus dudas en los foros de programación que con gusto aclararemos.
Siempre que desarrollamos una aplicacion web algo que nunca debe faltar es un formulario de contacto para que los usuarios que visitan o usan nuestra aplicacion web puedan ponerse en contacto con nosotros. Pues bien ahora veremos como hacer un formulario de contacto en asp.net y ademas le agregaremos recaptcha para evitar spam. Aspectos a considerar. El ejemplo esta desarrollado en visual estudio 2010 con c# y vb.net Tener una cuenta de correo gmail(que sera donde recibirás los mensajes). Lo primero sera descargar la libreria de recaptcha para asp.net (el ejemplo ya incluirá la librería). El diseño de nuestro formulario de contacto sera el siguiente(lo pueden personalizar como quieran) Como pueden observar el formulario tiene 4 textbox que ademas están validados con los controles de validación para que el usuario rellene todos los datos e ingrese un correo valido, también tiene el control recaptcha, tenemos un botón y abajo del botón tenemos un label que nos servirá para mostrar un mensaje al usuario para que sepa si se envió o no el mensaje. Ahora en nuestro web.config tendremos que agregar lo siguiente. <appsettings> <add key="To" value="TUCORREO@gmail.com"> </add></appsettings> <system.net> <mailsettings> <smtp> <network host="smtp.gmail.com" password="TUPASSWORD" username="TUCORREO@gmail.com" enablessl="true" port="587"> </network></smtp> </mailsettings> </system.net> Lo que hacemos es agregar los datos de nuestro servidor de correo en este caso utilizamos smtp de gmail, lo que esta en mayúscula lo tienen que remplazar por sus credencias(correo y password) de gmail lo medas no lo toquen. Ahora nos vamos al código de nuestro formulario y empezamos a programar, creemos los siguientes métodos. private void Limpiar() { txttitulo.Text = ""; txtnombre.Text = ""; txtcorreo.Text = ""; txtmensaje.Text = ""; lblaviso.Text = ""; } private void Enviar(string titulo, string nombre, string correo, string mensaje) { if (Page.IsValid) { string to = ConfigurationManager.AppSettings["To"]; MailMessage mail = new MailMessage(); mail.To.Add(new MailAddress(to)); mail.From = new MailAddress(correo, nombre); mail.Subject = titulo + " " + correo; mail.Body = mensaje + "nn" + nombre + "n" + correo; SmtpClient smtp = new SmtpClient(); smtp.Send(mail); Limpiar(); lblaviso.Text = "Mensaje Enviado gracias por tomarse el tiempo de escribir...!"; } else { lblaviso.Text = "No has escrito correctamente el codigo de verificacion"; } } Private Sub Limpiar() txttitulo.Text = "" txtnombre.Text = "" txtcorreo.Text = "" lblaviso.Text = "" End Sub Private Sub Enviar(ByVal titulo As String, ByVal nombre As String, ByVal correo As String, ByVal mensaje As String) If (Page.IsValid) Then Dim t As String = ConfigurationManager.AppSettings("To") Dim mail As New MailMessage() mail.To.Add(New MailAddress(t)) mail.From = New MailAddress(correo, nombre) mail.Subject = titulo + " " + correo mail.Body = mensaje + vbLf & vbLf + nombre + vbLf + correo Dim smtp As New SmtpClient() smtp.Send(mail) Limpiar() lblaviso.Text = "Mensaje Enviado gracias por tomarse el tiempo de escribir...!" Else lblaviso.Text = "No has escrito correctamente el codigo de verificacion" End If End Sub El primer método Limpiar lo único que ara es limpiar los textbox. El método Enviar es el que nos servirá para enviar el mensaje podemos ver que recibe 4 parámetros que son los que necesitamos para que se envié el mensaje, luego comprobamos que la pagina se valide correctamente y dentro leemos los datos del web.config y armamos el correo haciendo uso de la clase MailMessage y luego enviamos el correo usando la clase SmtpClient y mostramos los mensajes que el mensaje se envió correctamente, y si la pagina no se valida correctamente mostramos mensajes que no se pudo enviar el correo mensaje. Por ultimo dentro del evento click del botón hacemos lo siguiente. Enviar(txttitulo.Text,txtnombre.Text,txtcorreo.Text,txtmensaje.Text); Enviar(txttitulo.Text, txtnombre.Text, txtcorreo.Text, txtmensaje.Text) Lo único que hacemos es llamar al método Enviar y le pasamos los datos correspondientes. Pueden descargar los ejemplos en c# y vb.net de mi blog. http://cristiantorresalfaro.blogspot.com/2012/07/formulario-de-contacto-con-recaptcha.html

Buscando en Internet me he dado cuenta que existe poca información(o al menos en español) de como usar el control login de asp.net con una base de datos propia. De hecho la manera que les mostrare tambien puede ser usada creando nosotros mismos los controles de login. El proyecto fue desarrollado usando Visual Estudio 2010 y SqlExpress. La base de datos que usare para este ejemplo llamada Database y solo cuenta con una tabla usuarios y con los campos usuario y contraseña. Bueno lo primero que aremos es crear un proyecto web vació con lenguaje de programación c# (esto ya lo tienen que saber hacer por eso no pongo imágenes). Una vez hecho esto se creara el proyecto con la pagina default y el archivo de configuración(web.config) en el cual agregaremos lo siguiente. <connectionstrings> <add name="default" connectionstring="Data Source=.SQLEXPRESS;AttachDbFilename=|DataDirectory|DataBase.mdf;Integrated Security=True;User Instance=True" providername="System.Data.SqlClient"> </add></connectionstrings> <authentication mode="Forms"> <forms name="appNameAuth" path="/" loginurl="Login.aspx" defaulturl="Default.aspx" protection="All"> </forms></authentication> <authorization> <deny users="?"> </deny></authorization> Lo primero seria la conexión a la bd y en el segundo bloque estamos configurando para que todo el sitio este bajo una autentificación por medio de forms. También establecemos cual sera la pagina por defecto y cual la de login, de esta manera si el usuario no esta logueado se redirecciona a la pagina de login. Una ves que hayamos hecho esto lo anterior, agregaremos una clase a nuestro proyecto llamada Autentificacion.cs Y el código que tendrá nuestra clase sera el siguiente. using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Data.SqlClient; using System.Configuration; public static class Autentificacion { public static bool Autenticar(string usuario, string password) { //consulta a la base de datos string sql = @"SELECT COUNT(*) FROM Usuarios WHERE usuario = @user AND contraseña = @pass"; //cadena conexion using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ToString())) { conn.Open();//abrimos conexion SqlCommand cmd = new SqlCommand(sql,conn); //ejecutamos la instruccion cmd.Parameters.AddWithValue("@user", usuario); //enviamos los parametros cmd.Parameters.AddWithValue("@pass", password); int count = Convert.ToInt32(cmd.ExecuteScalar()); //devuelve la fila afectada if (count == 0) return false; else return true; } } } Como pueden observar lo único que se hace es crear un método estático de tipo bool que hace la validación del usuario y devuelve false si no se autentifico y true si se autentifico correctamente. Ahora lo que aremos es agregar un nuevo web form al cual llamaremos login y dentro de el ponemos el control login. Ahora nos vamos al código de la pagina login y ponemos lo siguiente. protected void Login1_Authenticate(object sender, AuthenticateEventArgs e) { if (Autentificacion.Autenticar(Login1.UserName, Login1.Password)) { FormsAuthentication.RedirectFromLoginPage(Login1.UserName, Login1.RememberMeSet); } } Lo que se hace es usar el evento Authenticate del control Login1 y dentro hacemos una validación de nuestro método Autenticar de la clase Autentificacion, pasandole como parámetros los datos del control Login1, si la validación se hace correctamente lo redireccionamos a la pagina default. Ahora en nuestra pagina default lo único que aremos es agregar un botón con el nombre btncerrar que lo único que ara es cerrar la autenticacion. nos vamos al código de nuestra pagina default y ponemos lo siguiente. protected void Page_Load(object sender, EventArgs e) { //si se autentica mostramos mensaje y nombre de usuario if (HttpContext.Current.User.Identity.IsAuthenticated) { Response.Write("Bienvenido : " + User.Identity.Name); } } protected void btncerrar_Click(object sender, EventArgs e) { //se borra la cookie de autenticacion FormsAuthentication.SignOut(); //se redirecciona al usuario a la pagina de login Response.Redirect(Request.UrlReferrer.ToString()); } Lo que se hace en este código es mostrar el mensaje bienvenido y el nombre del usuario autentificado en el evento load de la pagina, y luego en el evento del botón lo que se hace es cerrar el inicio de sesión y redireccionarlo a la pagina de login nuevamente. Importante que en los códigos cs de las paginas login y default tiene que ponerse el siguiente espacio de nombres al principio. using System.Web.Security; Eso seria todo si ejecutamos nuestro proyecto nos tendría que funcionar. Pueden encontrar el proyecto de descarga en la entrada de mi blog. http://cristiantorresalfaro.blogspot.com/2012/05/inicio-de-sesion-usando-el-control.html También no olviden pasar y registrarse en un nuevo foro de programación donde pueden dejar sus dudas sobre cualquier lenguaje de programación y con gusto se les ayudara. http://codemania.net/

Bueno esta vez les traigo la manera de implementar el famoso autocomplete en los textbox y comobobox. Esto sirve para facilitar el uso de nuestras aplicaciones a los usuarios y a la vez darle mas vistosidad. Para este ejemplo cree una pequeña base de datos llamada Eurocopa(aprovechando que ya se acerca la euro xD), la base de datos solo tiene una tabla llamada países y con 2 campos id y país. El diseño de la aplicación tambien sera algo sencillo solo tendrá un textbox y un combobox. Ahora lo que aremos es agregar una nueva clase a nuestro proyecto en mi caso le llamare AutoCompleClass.cs y lo primero que aremos es agregar los siguientes espacios de nombres que necesitaremos. using System.Data.SqlClient; using System.Configuration; using System.Windows.Forms; Ahora lo que aremos es hacer la clase publica y estática y agregaremos 2 métodos que usaremos. public static class AutoCompleClass { //metodo para cargar los datos de la bd public static DataTable Datos() { DataTable dt = new DataTable(); SqlConnection conexion = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ToString());//cadena conexion string consulta = "SELECT * FROM PAISES"; //consulta a la tabla paises SqlCommand comando = new SqlCommand(consulta,conexion); SqlDataAdapter adap = new SqlDataAdapter(comando); adap.Fill(dt); return dt; } //metodo para cargar la coleccion de datos para el autocomplete public static AutoCompleteStringCollection Autocomplete() { DataTable dt = Datos(); AutoCompleteStringCollection coleccion = new AutoCompleteStringCollection(); //recorrer y cargar los items para el autocompletado foreach (DataRow row in dt.Rows) { coleccion.Add(Convert.ToString(row["pais"])); } return coleccion; } } El primer método llamado Datos se usa para cargar los datos de nuestra base de datos y el método Autocomplete es el que servirá para cargar los datos del autocomplete, los 2 métodos son sencillos de comprender y lleva comentada las partes mas importantes. Ahora lo que aremos es crear el evento load de nuestro formulario y tendrá el siguiente código. private void Form1_Load(object sender, EventArgs e) { //cargar los datos para el autocomplete del textbox textBox1.AutoCompleteCustomSource = AutoCompleClass.Autocomplete(); textBox1.AutoCompleteMode = AutoCompleteMode.Suggest; textBox1.AutoCompleteSource = AutoCompleteSource.CustomSource; // Cargo los datos que tendra el combobox comboBox1.DataSource = AutoCompleClass.Datos(); comboBox1.DisplayMember = "pais"; comboBox1.ValueMember = "id"; // cargo la lista de items para el autocomplete dle combobox comboBox1.AutoCompleteCustomSource = AutoCompleClass.Autocomplete(); comboBox1.AutoCompleteMode = AutoCompleteMode.Suggest; comboBox1.AutoCompleteSource = AutoCompleteSource.CustomSource; } El primer bloque sirve para el autocomplete del textbox, que se hace con el uso de 3 propiedades AutoCompleteCustomSource que es la propiedad que obtiene la colección de datos que servirán para el autocomplete, AutoCompleteMode indica el modo de autocomplete y AutoCompleteSource indica de dónde se sacarán las sugerencias de rellenado automático. El segundo y tercer bloque es para el autocomplete del combobox que a diferencia del textbox este necesita de 2 listas una para cargar los datos normalmente con el DataSource y la otra para el autocomplete. Capturas Pueden descargar el proyecto desde mi blog. Descargar Proyecto También los invito a que se registren en un foro de programación ahí muy frecuentemente comparto códigos en diferentes lenguajes tambien pueden dejar sus preguntas que con gusto contestamos. http://codemania.net/ Para estar enterados de mis últimos artículos siganme en blogger. Saludos desde El Salvador
Esperen todos estén bien, antes de empezar el ejemplo de este articulo me tomo unas cuantas lineas para mencionarles a todos los que leen mis post que por motivos de trabajo y estudio no estaré haciendo artículos muy seguido como lo he hecho casi siempre(tratare de que sea al menos uno al mes), esto no quiere decir que me descuidare del blog para nada en mis tiempos libres tratare de seguir poniendo ejemplos y respondiendo cualquier duda que tengan. Bien en este articulo veremos algo sencillo pero seguro a mas de alguno le sirve, y es que siempre que desarrollamos aplicaciones web tenemos la necesidad de mostrar mensajes al usuario y muy frecuentemente mostramos este tipo de mensajes en los famosos alert de javascript , pero seguro a muchos esta ventana les parecerá poco atractiva incluso muy sencilla, pues bien ahora haciendo uso de un plugin de jQuery llamado jQuery UI veremos la manera de mostrar mensajes en una ventana con diseños muy bonitos y que al usuario le parecerá mas agradable. Veremos como hacerlo al lado del cliente y al lado del servidor. Veamos primero como hacerlo al lado del cliente. function MostrarMensaje(mensaje, titulo) { var ventana = $('<div id="errortitulo" title="' + titulo + '"> <span id="errormensaje">' + mensaje + '</span></div> '); ventana.dialog({ modal: true, buttons: { "OK": function () { $(this).dialog("close"); } }, show: "fold", hide: "scale", }); } $(document).ready(function () { $('#btnenviar2').click(function () { var nombre = $('#<%=txtnombre.ClientID%>').val(); var edad = $('#<%=txtedad.ClientID%>').val(); var mensaje = "Hola" + " " + nombre + " " + "tu tienes" + " " + edad + " " + "años de edad"; MostrarMensaje(mensaje, "Saludos"); }); }); Tenemos una función MostrarMensaje() que recibe 2 parámetros que sera el titulo que queremos que se muestre en la venta y el mensaje que queremos mostrar y dentro de esta tenemos algunas características, que podemos configurar de este pluging en este caso le agregamos un botón que al hacer click cierra la ventana y le agregamos algunos efectos (en la web del plugin pueden encontrar las diferentes propiedades que se pueden aplicar al pluging). Esta función nos servirá para mostrar el mensaje del lado del cliente como del lado del servidor Ahora para mostrar el mensaje desde el servidor usamos el evento click del botón html en este caso un input llamado btnenviar2, y dentro de este capturamos los datos de las cajas de texto y llamamos a la función MostrarMensaje() y le pasamos estos datos. Ahora veamos como mostrar el mensaje desde el servidor. protected void btnenviar_Click(object sender, EventArgs e) { string mensaje = string.Format("Hola {0} tu tienes {1} años de edad",txtnombre.Text, txtedad.Text); string script = string.Format("MostrarMensaje('{0}', '{1}')", mensaje, "Saludos"); ScriptManager.RegisterStartupScript(this, typeof(Page), "MostrarMensaje", script, true); } Para mostrar el mensaje desde el lado del servidor lo que tenemos que hacer es dentro del evento click del botón llamar la función javascript MostrarMensaje() y pasarle los parámetros y para eso hacemos uso del método ScriptManager.RegisterStartupScrip que sirve para registrar código javascript al lado del servidor. Si quieren descargar el ejemplo pueden hacerlo desde mi blog. http://cristiantorresalfaro.blogspot.com/2013/02/mostrar-mensajes-con-jquery-ui-aspnet.html Saludos.

Siguiendo con ejemplos de linq ahora veremos como funciona la cláusula Join. La cláusula Join sirve para establecer una relación entre 2 secuencias comparando sus claves. Los programadores familiarizados con conceptos de bases de datos relacionales reconocerán la cláusula Join como Inner Join. El ejemplo esta desarrollado en visual estudio 2010 en ambos lenguajes c# y vb.net pero en este post solo lo explicare en c# pueden encontrar el ejemplo en vb.net y descargarlo en ambos lenguajes desde mi blog al final dejo el link. Veamos el diseño que tendrá nuestra aplicacion. Ahora agregaremos 2 clases Categoría y Articulo. public class Categoria { public int CatId { get; set; } public string CatNombre { get; set; } public Categoria(int id, string nom) { CatId = id; CatNombre = nom; } } public class Articulo { public int ArtId { get; set; } public string ArtNombre { get; set; } public double ArtPrecio { get; set; } public int CatId { get; set; } public Articulo(int id,string nom,double prec, int cat) { ArtId = id; ArtNombre = nom; ArtPrecio = prec; CatId = cat; } } Como podemos notar son 2 clases sencillas con algunas propiedades que usaremos para representar nuestros datos, importante notar que ambas clases tienen una propiedad en común CatId que es la que usaremos para establecer la relación entre ellas. Ahora agreguemos algunos registros. List<Categoria> categorialist = new List<Categoria> { new Categoria(1, "Bebidas"), new Categoria(2, "Lacteos"), new Categoria(3, "Frutas") }; List<Articulo> articulolist = new List<Articulo> { new Articulo(1, "Cerveza negra Steeleye", 18.20, 1), new Articulo(2, "Queso Mozzarella", 34.50, 2), new Articulo(3, "Naranjas", 10.25, 3), new Articulo(4, "Cerveza Sasquatch", 15.00, 1), new Articulo(5, "Crema de Almejas", 9.75, 2), new Articulo(6, "Manzanas", 4.50, 3), new Articulo(7, "Vino Côte de Blaye", 250.25, 1), new Articulo(8, "Cerveza Heineken", 20.50, 1), new Articulo(9, "CocaCola", 5.75, 1) }; Hemos agregado 3 categorías y 9 artículos donde cada articulo tiene un código de categoría al que pertenece. Carguemos los artículos en el datagrid sin aplicar join y veremos como se muestran. private void Form1_Load(object sender, EventArgs e) { var query = from art in articulolist select art; dataGridView1.DataSource = query.ToList(); } Lo que hemos hecho es cargar los artículos en el datagrid normalmente. Ahora veamos como utilizar el Join de linq para que no nos muestre el código de categoría(CatId) si no que nos muestre el nombre de la categoría la que el articulo pertenece. var query = from cat in categorialist join art in articulolist on cat.CatId equals art.CatId orderby art.ArtId ascending select new { Id = art.ArtId, Nombre = art.ArtNombre, Precio = art.ArtPrecio, Categoria = cat.CatNombre }; dataGridView1.DataSource = query.ToList(); Como verán tiene un gran parecido al inner join de sql donde por medio de la propiedad que tienen en común CatId podemos establecer la relación entre ambas clases y así poder consultar los campos que necesitemos. Pueden descargar el ejemplo en ambos lenguajes c# y vb.net desde mi blog. http://cristiantorresalfaro.blogspot.com/2012/09/combinar-datos-linqoperador-join-c-vbnet.html Para todos los que tienen blog pueden seguirme y estar pendientes de mis nuevos artículos.

Primeramente les deseo feliz año 2013 a todos los lectores de mis post espero que este año este lleno de muchas bendiciones para todos. Quiero empezar este año con un ejemplo que es muy común y necesario a la hora de hacer reportes con crystal report, y es que cuando creamos reportes en ocasiones tenemos la necesidad de filtrar los datos por medio de uno o varios campos. El ejemplo sera uno simple para que puedan entenderlo, la base de datos que usare para el ejemplo solo cuenta con 2 tablas Categoría y Articulo. Creamos un dataset(DsReporte) y agregamos 2 datatable que representaran las 2 tablas de la base de datos ademas le agregamos los campos correspondiente de cada tabla y también indicamos el tipo de dato de cada campo. Importante que cada datatable tiene que llamarse como el nombre de la tabla en la base de datos y ademas tener los mismos campos y mismo tipo de dato que tienen en la base de datos. Creamos el reporte usando el dataset que creamos(el reporte mostrara todos los articulos de nuestra base de datos). Ahora crearemos el código que usaremos para llenar el dataset y mostrar los datos en el reporte así que agregamos una clase(modulo en el caso de vb) llamada Datos y agregamos el siguiente codigo. public static DataTable CargarCategoria() { using (SqlConnection cnn = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ToString())) { DataTable dt = new DataTable(); string query = "SELECT * FROM Categoria"; SqlCommand cmd = new SqlCommand(query, cnn); SqlDataAdapter da = new SqlDataAdapter(cmd); da.Fill(dt); return dt; } } public static DsReporte CargarArticulos() { DsReporte ds = new DsReporte(); using (SqlConnection cnn = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ToString())) { string query = "SELECT * FROM Articulo"; SqlCommand cmd = new SqlCommand(query, cnn); SqlDataAdapter da = new SqlDataAdapter(cmd); da.Fill(ds, "Articulo"); return ds; } } public static DsReporte FiltrarArticulos(int categoria) { DsReporte ds = new DsReporte(); using (SqlConnection cnn = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ToString())) { string query = "SELECT * FROM Articulo WHERE CatId=@cat"; SqlCommand cmd = new SqlCommand(query, cnn); cmd.Parameters.AddWithValue("@cat", categoria); SqlDataAdapter da = new SqlDataAdapter(cmd); da.Fill(ds, "Articulo"); return ds; } } Public Function CargarCategoria() As DataTable Using cnn As New SqlConnection(ConfigurationManager.ConnectionStrings("default").ToString()) Dim dt As New DataTable() Dim query As String = "SELECT * FROM Categoria" Dim cmd As New SqlCommand(query, cnn) Dim da As New SqlDataAdapter(cmd) da.Fill(dt) Return dt End Using End Function Public Function CargarArticulos() As DsReporte Dim ds As New DsReporte() Using cnn As New SqlConnection(ConfigurationManager.ConnectionStrings("default").ToString()) Dim query As String = "SELECT * FROM Articulo" Dim cmd As New SqlCommand(query, cnn) Dim da As New SqlDataAdapter(cmd) da.Fill(ds, "Articulo") Return ds End Using End Function Public Function FiltrarArticulos(ByVal categoria As Integer) As DsReporte Dim ds As New DsReporte() Using cnn As New SqlConnection(ConfigurationManager.ConnectionStrings("default").ToString()) Dim query As String = "SELECT * FROM Articulo WHERE CatId=@cat" Dim cmd As New SqlCommand(query, cnn) cmd.Parameters.AddWithValue("@cat", categoria) Dim da As New SqlDataAdapter(cmd) da.Fill(ds, "Articulo") Return ds End Using End Function El metodo CargarCategoria() obtiene todos los datos de la tabla categoría en un datatable. El metodo CargarArticulos() llena el dataset con los datos de la tabla articulos. El metodo FiltrarArticulos() también llena el dataset con los datos de la tabla artículos pero a diferencia del anterior este los llena aplicando un filtro que en este caso es por medio del campo CatId. Ahora programaremos el código que tendrá nuestro Form. private void Form1_Load(object sender, EventArgs e) { comboBox1.DataSource = Datos.CargarCategoria(); comboBox1.DisplayMember = "CatNombre"; comboBox1.ValueMember = "CatId"; comboBox1.SelectedIndex = -1; DsReporte datos = Datos.CargarArticulos(); CrpReporte report = new CrpReporte(); report.SetDataSource(datos); crystalReportViewer1.ReportSource = report; } private void comboBox1_SelectionChangeCommitted(object sender, EventArgs e) { DsReporte datos = Datos.FiltrarArticulos(Convert.ToInt32(comboBox1.SelectedValue)); CrpReporte report = new CrpReporte(); report.SetDataSource(datos); crystalReportViewer1.ReportSource = report; } Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ComboBox1.DataSource = Datos.CargarCategoria() ComboBox1.DisplayMember = "CatNombre" ComboBox1.ValueMember = "CatId" ComboBox1.SelectedIndex = -1 Dim da As DsReporte = Datos.CargarArticulos() Dim report As New CrpReporte() report.SetDataSource(da) CrystalReportViewer1.ReportSource = report End Sub Private Sub ComboBox1_SelectionChangeCommitted(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectionChangeCommitted Dim da As DsReporte = Datos.FiltrarArticulos(Convert.ToInt32(ComboBox1.SelectedValue)) Dim report As New CrpReporte() report.SetDataSource(da) CrystalReportViewer1.ReportSource = report End Sub En el evento Load cargamos las categorias en un combobox y tambien cargamos en el reporte todos los artículos. En el evento SelectionChangeCommitted del combobox cargamos los datos en el reporte dependiendo la categoría seleccionada en el combobox, asi cada vez que el usuario seleccione una categoría del combobox los datos del reporte solo mostraran los artículos que pertenecen a la categoría seleccionada. Eso es todo espero les sirva mucho, si quieren descargar los ejemplos pueden hacerlo desde mi blog. http://cristiantorresalfaro.blogspot.com/2013/01/filtrar-datos-de-reporte-crystal-report.html
En el articulo anterior creamos nuestro modelo EDMX de nuestra base de datos y también creamos nuestras clases entidades y las dividimos en una capa aparte llamada Entities. Pueden ver el primer articulo aquí. http://www.taringa.net/posts/ciencia-educacion/15748498/Desarrollo-en-Capas-_Net-Entity-Framework_Parte-1_.html Pues bien en este segundo articulo desarrollaremos el código que tendrá nuestra capa de datos(DataAcces). En la capa de datos(DataAcces) es donde tendremos todas las query a nuestra base de datos. Antes de empezar a programar en nuestra capa de datos primero agregaremos una clase llamada NotaAlumno en nuestra capa Entities(ya veremos para que nos servira). public class NotaAlumno { public int NotId { get; set; } public string AluNombre { get; set; } public string MatNombre { get; set; } public decimal NotNota { get; set; } } Entonces nuestra capa Entities nos quedara de la siguiente manera Como pueden observar nuestra capa Entities tendrá nuestras clases entidades que generamos en el articulo anterior y la nueva clase que acabamos de agregar. Ahora si empecemos con el código que tendrá nuestra capa de datos(DataAcces) lo que aremos es que por cada clase entidad agregaremos una clase a nuestra capa de datos(DataAcces) y dentro de estas tendremos las diferentes query a nuestra base de datos. Agreguemos la primera clase que se llamara AlumnoDAL. public class AlumnoDAL { public static List<Alumno> CargarAlumnos() { using (EstudiantesEntities bd = new EstudiantesEntities()) { return bd.Alumno.ToList(); } } public static bool Existe(int id) { using (EstudiantesEntities bd = new EstudiantesEntities()) { var query = (from al in bd.Alumno where al.AluId == id select al).Count(); if (query == 0) return false; else return true; } } public static Alumno IdAlumno(int id) { Alumno alum = new Alumno(); using (EstudiantesEntities bd = new EstudiantesEntities()) { var query = (from al in bd.Alumno where al.AluId == id select al).Single(); alum.AluId = query.AluId; alum.AluNombre = query.AluNombre; alum.AluApellido = query.AluApellido; alum.AluEdad = query.AluEdad; alum.AluDireccion = query.AluDireccion; } return alum; } public static Alumno CreateAlumno(Alumno alum) { using (EstudiantesEntities bd = new EstudiantesEntities()) { Alumno al = new Alumno(); al.AluNombre = alum.AluNombre; al.AluApellido = alum.AluApellido; al.AluEdad = alum.AluEdad; al.AluDireccion = alum.AluDireccion; bd.Alumno.Add(al); bd.SaveChanges(); alum.AluId = al.AluId; } return alum; } public static Alumno UpdateAlumno(Alumno alum) { using (EstudiantesEntities bd = new EstudiantesEntities()) { var query = (from al in bd.Alumno where al.AluId == alum.AluId select al).Single(); query.AluNombre = alum.AluNombre; query.AluApellido = alum.AluApellido; query.AluEdad = alum.AluEdad; query.AluDireccion = alum.AluDireccion; bd.SaveChanges(); } return alum; } } Dentro de esta clase tenemos una serie de métodos que ahorita explicare. CargarAlumnos() Este método lo único que hace es retornar todos los registros de la tabla Alumno. Existe() Este método se encarga de comprobar si un alumno existe por medio del id retorna false si no existe y true si ya existe. IdAlumno() Este método lo que hace es retornar los datos de un alumno también por medio del id. CreateAlumno() Este método agrega un nuevo alumno a nuestra base de datos y luego de agregarlo retornamos la entidad osea el alumno agregado. UpdateAlumno() Este método actualiza un alumno utilizamos el id para actualizar los datos y luego también retornamos la entidad osea el alumno actualizado. Ahora agreguemos una clase llamada NotaDal. public class NotaDal { public static bool Existe(int idalum, int idmat) { using (EstudiantesEntities bd = new EstudiantesEntities()) { var query = (from not in bd.Nota where not.AluId == idalum && not.MatId == idmat select not).Count(); if (query == 0) return false; else return true; } } public static Nota IdNota(int id) { Nota not = new Nota(); using (EstudiantesEntities bd = new EstudiantesEntities()) { var query = (from n in bd.Nota where n.NotId == id select n).Single(); not.NotId = query.NotId; not.AluId = query.AluId; not.MatId = query.MatId; not.NotNota = query.NotNota; } return not; } public static Nota CreateNota(Nota not) { using (EstudiantesEntities bd = new EstudiantesEntities()) { Nota n = new Nota(); n.AluId = not.AluId; n.MatId = not.MatId; n.NotNota = not.NotNota; bd.Nota.Add(n); bd.SaveChanges(); not.NotId = n.NotId; } return not; } public static Nota UpdateNota(Nota not) { using (EstudiantesEntities bd = new EstudiantesEntities()) { var query = (from n in bd.Nota where n.NotId == not.NotId select n).Single(); query.AluId = not.AluId; query.MatId = not.MatId; query.NotNota = not.NotNota; bd.SaveChanges(); } return not; } } Dentro de esta clase encontramos los siguientes métodos. Existe() Este método se encargara de comprobar si una nota ya existe por medio del id del alumno y el id de la materia este método nos ayudara para que un alumno solo pueda agregar una nota por materia. IdNota() Este método lo que hace es retornar los datos datos de un registro por medio del id. CreateNota() Este método agrega un registro a la tabla nota y luego retornamos la entidad osea el registro agregado. UpdateNota() Este método actualiza una nota utilizamos el id para actualizar los datos y luego también retornamos la entidad osea el registro actualizado. Ahora agreguemos una clase llamada MateriaDal. public class MateriaDal { public static List<Materia> CargarMaterias() { using (EstudiantesEntities bd = new EstudiantesEntities()) { return bd.Materia.ToList(); } } } Dentro de esta clase solo tenemos un método CargarMaterias() que lo único que hace es retornar todos los registros de la tabla materia. Ahora agreguemos una clase llamada NotaAlumnoDal. public class NotaAlumnoDal { public static List<NotaAlumno> CargarNotas() { using (EstudiantesEntities bd = new EstudiantesEntities()) { var query = from not in bd.Nota select new NotaAlumno { NotId = not.NotId, AluNombre = not.Alumno.AluNombre, MatNombre = not.Materia.MatNombre, NotNota = not.NotNota }; return query.ToList(); } } public static List<NotaAlumno> NotasAlumno(int id) { using (EstudiantesEntities bd = new EstudiantesEntities()) { var query = from not in bd.Nota where not.AluId == id select new NotaAlumno { NotId = not.NotId, AluNombre = not.Alumno.AluNombre, MatNombre = not.Materia.MatNombre, NotNota = not.NotNota }; return query.ToList(); } } } Dentro de esta clase encontramos los siguientes métodos. CargarNotas() este método retorna todos los registros de la tabla nota. NotasAlumno() este método retorna todas las notas de un alumno es por eso que hacemos uso del id del alumno para solo devolver solo las notas de un alumno. En esta clase hicimos uso de la clase que agregamos a nuestra capa Entities llamada NotaAlumno si se fijan en la query que hacemos a la tabla nota hacemos uso de las propiedades de la clase para en vez de que nos muestre el id del alumno y la materia nos muestre el nombre del alumno y de la materia, haciendo también uso de las propiedades de navegación que existen ente las tablas. Importante que dentro de cada clase que agregamos a nuestra capa de datos(DataAcces) necesitamos el espacio de nombres Entities para poder hacer uso de nuestras clases entidades. using Entities; Eso seria todo en nuestra capa de datos, al final nuestro proyecto nos quedara de la siguiente manera. Resumiendo lo que hicimos agregamos 4 clases(DAL) a nuestra capa de datos(DataAcces) una por cada clase entidad y dentro de estas tenemos las diferentes query hacia la base de datos. Si quieren descargar el codigo de esta segunda parte del proyecto pueden hacerlo desde mi blog. Desarrollo en Capas Entity Framework(Parte 2) - Capa de Datos En el próximo articulo desarrollaremos el código de nuestra capa de negocio(BussinesLayer). Si quieres estar pendiente de la siguiente parte del ejemplo o te gustaría ver mis demás artículos sígueme en mi blog. http://cristiantorresalfaro.blogspot.com
Cuando usamos el control DataGridView muchas veces necesitamos realizar operaciones sobre las filas o columnas del control, ahora veremos la manera de como realizar la suma de una columna del datagriedview usando linq. El ejemplo esta desarrollado en visual estudio 2010 con los lenguajes c# y vb.net. El ejemplo es sencillo y usare un datatable que lleno manualmente para el origen de datos, en un ejemplo real este datatable se llenaría con datos de una base de datos. El diseño de la aplicacion es el siguiente. Ahora veamos la manera como llenamos el datatable con los datos que usaremos private DataTable Datos() { DataTable dt = new DataTable(); dt.Columns.Add("Id"); dt.Columns.Add("Producto"); dt.Columns.Add("Total"); DataRow row = dt.NewRow(); row["Id"] = 1; row["Producto"] = "Arroz"; row["Total"] = 50.00; dt.Rows.Add(row); row = dt.NewRow(); row["Id"] = 2; row["Producto"] = "Pollo"; row["Total"] = 75.25; dt.Rows.Add(row); row = dt.NewRow(); row["Id"] = 3; row["Producto"] = "Frijoles"; row["Total"] = 60.25; dt.Rows.Add(row); row = dt.NewRow(); row["Id"] = 4; row["Producto"] = "Leche"; row["Total"] = 45.25; dt.Rows.Add(row); return dt; } Private Function Datos() As DataTable Dim dt As New DataTable() dt.Columns.Add("Id") dt.Columns.Add("Producto") dt.Columns.Add("Total") Dim row As DataRow = dt.NewRow() row("Id") = 1 row("Producto") = "Arroz" row("Total") = 50.0 dt.Rows.Add(row) row = dt.NewRow() row("Id") = 2 row("Producto") = "Pollo" row("Total") = 75.25 dt.Rows.Add(row) row = dt.NewRow() row("Id") = 3 row("Producto") = "Frijoles" row("Total") = 60.25 dt.Rows.Add(row) row = dt.NewRow() row("Id") = 4 row("Producto") = "Leche" row("Total") = 45.25 dt.Rows.Add(row) Return dt End Function Es un método de tipo datatable que retornara todos los datos en este caso como ya lo dije agrego los datos manualmente en caso de usar una base de datos lo único que cambiaría seria la manera de como se llena el datatable. Ahora en el evento load del formulario cargamos los datos en el datagriedview y agregamos una nueva fila al datatable. private void Form1_Load(object sender, EventArgs e) { //agregamos una nueva fila al datatable DataTable dt = Datos(); DataRow row= dt.NewRow(); dt.Rows.Add(row); //mostramos los datos en el datagriedview dataGridView1.AutoGenerateColumns = false; dataGridView1.DataSource = dt; //Mostramos el valor de 0 en la fila que agregamos DataGridViewRow rowtotal = dataGridView1.Rows[dataGridView1.Rows.Count - 1]; rowtotal.Cells["Total"].Value = 0; } Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'agregamos una nueva fila al datatable Dim dt As DataTable = Datos() Dim row As DataRow = dt.NewRow() dt.Rows.Add(row) 'mostramos los datos en el datagriedview dataGridView1.AutoGenerateColumns = False dataGridView1.DataSource = dt 'mostramos el valor de 0 en la fila que agregamos Dim rowtotal As DataGridViewRow = dataGridView1.Rows(dataGridView1.Rows.Count - 1) rowtotal.Cells("Total").Value = 0 End Sub Lo primero que hacemos es agregar una nueva fila al datatable que nos servirá para mostrar el total de la suma de la columna, luego cargamos los datos en el datagriedview y por ultimo le asignamos el valor de 0 a la fila que agregamos para calcular la suma. Lo ultimo que nos queda por hacer es calcular la suma de la columna del datagriedview que en este caso sera la columna Total y mostrar el resultado. private void btntotal_Click(object sender, EventArgs e) { //hacemos la suma de la columna total double resul = dataGridView1.Rows.Cast<DataGridViewRow>().Sum(x => Convert.ToDouble(x.Cells["Total"].Value)); //mostramos la suma en el textbox y en la fila que agregamos txttotal.Text = Convert.ToString(resul); DataGridViewRow rowtotal = dataGridView1.Rows[dataGridView1.Rows.Count - 1]; rowtotal.Cells["Total"].Value = resul; } Private Sub btntotal_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btntotal.Click 'hacemos la suma de la columna Total Dim resul As Double = dataGridView1.Rows.Cast(Of DataGridViewRow)().Sum(Function(x) Convert.ToDouble(x.Cells("Total").Value)) 'mostramos la suma en el textbox y en la fila que agregamos txttotal.Text = Convert.ToString(resul) Dim rowtotal As DataGridViewRow = dataGridView1.Rows(dataGridView1.Rows.Count - 1) rowtotal.Cells("Total").Value = resul End Sub Como pueden observar si se hace uso de linq se puede obtener la suma de la columna del datagriedview en una sola linea de código sin necesidad de recorrer el datagriedview, luego que se obtiene el resultado lo único que se hace es mostrarlo en el textbox y en la fila adicional que agregamos. Eso es todo, pueden descargar el ejemplo desde mi blog saludos. http://cristiantorresalfaro.blogspot.com/2012/08/sumar-columnas-datagridview-usando-linq.html