Buscar este blog

Mostrando entradas con la etiqueta C#. Mostrar todas las entradas
Mostrando entradas con la etiqueta C#. Mostrar todas las entradas

viernes, 22 de noviembre de 2013

Añadir css embebidos en tus controles web(.net)

Hola, hoy les explicare como embeber un archivo css en tu control web que estés desarrollando, lo primero que hay que hacer es lo siguiente:

1. Modifica el archivo AssemblyInfo.cs y agrega esto:

[assembly: System.Web.UI.WebResource("CustomControls.Styles.GridStyles.css", "text/css"), PerformSubstitution = true)]

Donde CustomControls es tu proyecto y style tu carpeta donde tienes el css, prácticamente es ponerlo como se formaría un namespace.

2. Al archivo .css aplicale la propiedad de BuildAction a  Embedded Resource, para que se embeba en nuestra dll.

3. Ahora si, el código que necesitamos es el siguiente:


protected override void OnPreRender(EventArgs e) 
   {
        bool linkIncluded = false;
        foreach (Control c in Page.Header.Controls)
        {
            if (c.ID == "GridStyle")
            {
                linkIncluded = true;
            }
        }
        if (!linkIncluded)
        {
            HtmlGenericControl csslink = new HtmlGenericControl("link");
            csslink.ID = "GridStyle";
            csslink.Attributes.Add("href", Page.ClientScript.GetWebResourceUrl(this.GetType(), "CustomControls.Styles.GridStyles.css"));
            csslink.Attributes.Add("type", "text/css");
            csslink.Attributes.Add("rel", "stylesheet");
            Page.Header.Controls.Add(csslink);
        }
    }

4. Si quieres hacer una referencia a una imagen pues embeber la imagen y referenciarla de esta manera en tu css:

background: url('<%=WebResource("CustomControls.Styles.Cross.png")%>') no-repeat 95% 50%;

Como ven esto es muy facil de implementar y espero que les sea de utilidad.

martes, 23 de octubre de 2012

Agregar método extendido a un objeto (clase o control) en C#

Hoy veremos como agregar un método adicional a un clase o control que no son propios de nuestro código  por ejemplo podríamos agregar una extensión a la clase DataTable que permita convertir todos sus datos a un XML, o agregar una extensión a un GridView para poder exportar a Excel. Estos tipos de métodos son muy útiles para encapsular una funcionalidad común para un tipo de objeto en especifico.

Ejemplo:
Primero agregamos una clase nueva a nuestro proyecto "ListBoxExtension", esta clase tendrá todos los métodos extendidos del control ListBox.

public static class ListBoxExtension
    {
        public static string ConvertToXml(this GandA.Web.UI.Controls.ListBox listBox)
        {
            string xml = string.Empty;
            foreach (ListItem item in listBox.ControlListBox.Items)
            {
                xml = xml + "<Item><Value>" + item.Value + "</Value></Item>";
            }

            if (!string.IsNullOrEmpty(xml))
                xml = "<Items>" + xml + "</Items>";

            return xml;
        }
}

Como pueden observar, para decir que nuestro método sera un extensión recibe como parámetro el control anteponiendo la palabra "this".
Si queremos utilizar el método, lo haremos de la siguiente manera:

protected void btnGuardar_Click(object sender, EventArgs e)
{
     lstEstPaq.ConvertToXml();
}

Donde "lstEstPaq", es nuestro control ListBox, y "ConvertToXml" es nuestro extension. Podrán observar que este método sólo va a aparecer si se esta haciendo referencia a la clase ListBoxExtension, para ello agreguen su using.

using CLab.Utils.Extensions;

Donde "MiProyecto.Utils.Extensions" es mi namespace donde se encuentra mi clase ListBoxExtension.

Como pueden darse cuenta la extensión de métodos es algo muy sencillo de implementar y que nos ayuda a encapsular y agregar funcionalidades extras a clases o controles que no son parte de nuestro código.
Espero que esto les ayude, y cual quier duda preguntes

--------------------------------------------------------------
Lo que se puede imaginar... se puede programar

miércoles, 11 de julio de 2012

Número Aleatorio en C# - Random

Hoy veremos como obtener números aleatorios en C# con la clase Random, esta clase que nos proporciona el framework como verán es muy fácil de utilizar, sólo hay que instanciar un objeto de esta clase y ejecutar el método Next, NextDouble o NextBytes.
Como verán podrán obtener aleatoriamente  números enteros, decimales y arreglos de bytes, aquí les dejo un ejemplo:

using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Random numAleatorio = new Random();


            // Numero maximo 100
            Console.WriteLine("Numero maximo aleatorio 100");
            Console.WriteLine(numAleatorio.Next(100));


            Console.WriteLine(Char.ToString((char)32));
            Console.WriteLine("Numero aleatorio entre 100 y 1000");
            // Rango de 100 a 1000
            for (int i = 0; i &lt; 10; i++)
            {
                Console.WriteLine(numAleatorio.Next(100, 1000));
            }


            Console.WriteLine(Char.ToString((char)32));
            Console.WriteLine("Numero aleatorio doble(decimal) entre 0 y 1");
            // Numero decimal entre 0 y 1
            Console.WriteLine(numAleatorio.NextDouble());


            Console.WriteLine(Char.ToString((char)32));
            Console.WriteLine("Presione Enter para Salir...");


            int tecla = Console.Read();
        }
    }
}

Espero que esto les sea de utilidad....
-------------------------------------------------
Lo que se puede imaginar... se puede programar

martes, 10 de julio de 2012

Thread C#, Manejo de multiprocesos - hilos en .Net

Hola, hoy veremos como manejar subprocesos en C# para evitar que nuestras pantallas se congelen al hacer una acción, esto aplica tanto para windows forms como para web forms, pero es mas común manejar lo en windows form. El manejo de estos hilos se pueden manejar con la clase Thread, aquí un ejemplo sencillo:

Thread t = new Thread(new ThreadStart(Process)); t.Start();


// Función a ejecutar en un hilo del proceso principal
private void Process()
{
    ////... Código
}

Como verán es muy sencillo ejecutar un método en un subproceso/hilo, con en metodo Start se dara inicio a ese subproceso y con la instrucción Abort, como su nombre lo dice podrás detener el subproceso lanzado de manera explicita. A continuación les dejo un ejemplo mas real de como se comportaría una pantalla si se ejecuta un proceso como subproceso y de manera normal.

using System;
using System.Windows.Forms;
using System.Threading;


namespace Multihilo
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }


        private void BtnProcess_Click(object sender, EventArgs e)
        {
            Thread t = new Thread(new ThreadStart(Process));
            //BtnProcess.Enabled = false;
            t.Start();
            //t.Join();
            //BtnProcess.Enabled = true;


            //Sin Multiproceso
        }


        private void Process()
        {
            double i, j;
            double num=0;
            for (i = 0; i < 10000; i++)
            {
                for (j = 0; j < 90000;j++ )
                    num = i;
            }
            MessageBox.Show("Numero = " + num.ToString());
        }


        private void BtnNormal_Click(object sender, EventArgs e)
        {
            Process();
        }


        private void BtnJoin_Click(object sender, EventArgs e)
        {
            Thread t = new Thread(new ThreadStart(Process));
            //BtnProcess.Enabled = false;
            t.Start();
            t.Join();
            //BtnProcess.Enabled = true;
        }
    }
}

Espero que esto les sea de utilidad.

Código fuente:
Descargar(en VS2008)
-------------------------------------
Lo que se puede imaginar... se puede programar

jueves, 26 de enero de 2012

PageMethods en Asp.Net AJAX


Hola, hoy veremos como utilizar ajax de una manera muy sencilla, esto se logra atreves de los PageMethods, estos se comunicaran con un WebMethod que este en nuestro código de la pagina (del lado del servidor) .

Lo primero que aremos es definir nuestro WebMethod, esto significa que a nuestro método lo decoraremos con el atributo [WebMethod], ejemplo:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication2
{
    public partial class _Default : System.Web.UI.Page
    {
        [WebMethod]
        public static List<Persona> SendForm(string name)
        {
            ////return name + " - Fue al servidor";
            List<Persona> p = new List<Persona>();
            p.Add(new Persona("Nombre 1", 26));
            p.Add(new Persona("Nombre 2", 26));
            return p;
        }

        protected void Page_Load(object sender, EventArgs e)
        {
        }
    }

    public class Persona
    {
        public Persona()
        {

        }

        public Persona(string nombre, int edad)
        {
            Nombre = nombre;
            Edad = edad;
        }
        public string Nombre
        {
            get; set;
        }

        public int Edad
        {
            get; set;
        }

    }
}

Cabe aclarar que un un PageMethod podrá retornar casi cualquier tipo de datos que regrese el WebMethod, en este ejemplo retorna una lista de objetos de tipo Persona.

Ahora del lado del cliente definimos lo siguiente:
      1. Habilitar los PageMethods
Lo que hay que hacer para permitir PageMethods es prender una propiedad de nuestro ScriptManager.

<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true">
                        <Scripts>
                                  <asp:ScriptReference Path="~/Scripts/Default.js" />
                       </Scripts>
           </asp:ScriptManager>

           Tambien aprovechamos para hacer referencia a nuestro js que contiene las funciones que utilizaremos.
      
      2. Crear nuestro script (Default.js)
             Esta es la función que llamaremos desde el click de un botón (el nombre es indistinto), el objeto PageMethods contiene los webMethods que tengamos en nuestro codigo de la pagina (en el .cs)
function SendForm() {
    var name = $get(textBox1).value;
    PageMethods.SendForm(name, OnSucceeded, OnFailed);
}
Las funciones de OnSucceeded y OnFailed deben ser incluidas como parámetros en la ejecución de nuestro PageMethod PageMethods.SendForm(name, OnSucceeded, OnFailed), y el primer parámetro es parte de nuestro WebMethod.

Esta function cacha el resultado de nuestro webMethod:
function OnSucceeded(lista) {
    $get(lblPrueba).innerHTML = string;
}

Esta function es utilizada para cachar un possible error:
function OnFailed(error) {
    alert(error.get_message());
}

      3.  En el aspx:
     <p>
        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <ContentTemplate>
                <asp:Button ID="Button1" runat="server" Text="Button" OnClientClick="SendForm();" />
            </ContentTemplate>
        </asp:UpdatePanel>
        <asp:Label ID="LblPrueba" runat="server" Text="Label"></asp:Label>
    </p>
    <script type="text/javascript">
        var lblPrueba = '<%=LblPrueba.ClientID %>';
        var textBox1 = '<%=TextBox1.ClientID %>';
    </script>

Como ven esta manera de utilizar ajax es muy facil y te olvidas de mandar a llamar un pagina y en el load procesar la petición... entre otras cosas, de esta forma el codigo queda en la misma pagina y se manda a llamar de una manera transparente.
Espero que esto les sea de utilidad.

Lo que se puede imaginar ... se puede programar

domingo, 4 de diciembre de 2011

Enviar un correo electrónico en .Net

Les dejo el siguiente código para enviar un correo electrónico:

Clase Smtp:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Mail;
using System.Net;

namespace ServerSmtp
{
    public class Smtp
    {
        #region Variables
        String _To;
        String _From;
        String _ServerSMTP;
        String _Password;
        String _Body;
        String _subject;
        bool _isBodyHtml;
        int _puerto;
        #endregion

        #region Propiedades
        public String To
        {
            set { _To = value; }
        }
        public String From
        {
            set { _From = value; }
        }
        public String SMTP
        {
            set { _ServerSMTP = value; }
        }
        public String Password
        {
            set { _Password = value; }
        }
        public String Body
        {
            set { _Body = value; }
        }
        public String Subject
        {
            set { _subject = value; }
        }
        public bool isBodyHtml
        {
            set { _isBodyHtml = value; }
        }
        public int Puerto
        {
            set { _puerto = value; }
        }
        #endregion

        public void Send()
        {
            SmtpClient clienteSmtp = new SmtpClient(this._ServerSMTP, this._puerto);
            clienteSmtp.UseDefaultCredentials = false;
            clienteSmtp.EnableSsl = true;
            if (this._Password.Trim() != "")
                clienteSmtp.Credentials = new NetworkCredential(this._From, this._Password);

            try
            {
                MailMessage msg = new MailMessage();
                msg.To.Add(new MailAddress(this._To));
                msg.From = new MailAddress(this._From);
                msg.Subject = this._subject;
                msg.IsBodyHtml = true;
                msg.Body = this._Body;
             
                clienteSmtp.Send(msg);
            }
            catch (SmtpException ex)
            {
                throw new Exception(ex.Message);
            }
            catch (Exception e)
            {
                throw e;
            }
        }
    }
}

Como utilizar la clase:

Smtp email = new Smtp();
email.From = "prueba@gmail.com";
email.Password = "password";
email.SMTP = "smtp.gmail.com";
email.Puerto = 587;
email.To = para@gmail.com;
email.isBodyHtml = true;
email.Subject = "Subject";
email.Body = "<div style='font-family:Arial, Helvetica, sans-serif;font-size:11px;'>Prueba</div>";
email.Send();

-------------------------------------------------
Lo que se puede imaginar .. se puede programar

jueves, 1 de diciembre de 2011

Crear una pagina base en .Net

Hoy veremos lo sencillo que es crear una pagina base en .Net y la utilidad que tiene.

¿Que es una pagina base?
Es una clase responsable de definir las propiedades comunes, definir los valores por defecto, lógica de renderización básica.
Por ejemplo, puede ser utilizada para validar si la sesión del usuario sigue activa y si no es así sacarlo de la pagina actual. Hay mil funcionalidades que tus paginas pueden tener en común, y esto te ayudara a que el código quede centralizado y reutilizado por cada pagina que herede de la pagina base.

Ahora si, sabiendo para que nos sirve una pagina base vamos al ejemplo.

Ejemplo en C#

Clase Base: Nuestra clase base hereda de Page como lo hacen todas la paginas.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;


namespace Ejemplo.Base
{
    public class PageBase : System.Web.UI.Page
    {
         //Aquí sobre escribimos los eventos de una pagina, de igual manera podemos agregar métodos y propiedades


         protected override void OnLoad(EventArgs e)
         {
            // Logica comun al cargar la pagina


            // Ejecuta el load de la pagina que utiliza la pagina base
            base.OnLoad(e);
        }


        // De igual manera podemos sobreescribir otros eventos
        protected override void OnLoadComplete(EventArgs e)
        {
            base.OnLoadComplete(e);
        }
    }
}


Aplicando nuestra pagina base:


using System;
using System.Collections.Generic;
using System.Data;
using System.Web;
using System.Linq;
using System.Text;


namespace Ejemplo
{
    public partial class CarritoDetalle : PageBase //-> Antes System.Web.UI.Page, se remplaza por nuestra clase
    {
        protected void Page_Load(object sender, EventArgs e)
        {
             //La código del load se esta ejecutando después del load de la pagina base
        }
     }
}


Este es un ejemplo muy practico y fácil que pueden utilizar, espero que les sea de utilidad.


-----------------------------------------------------
Lo que se puede imaginar ... se puede programar 

IsDate() en C#

C# no cuenta con una función IsDate como Visual Basic, pero la podemos emular de la siguiente manera:

        private void Form1_Load(object sender, EventArgs e)
        {
            if (IsDate("01/12/2011"))
            {
                MessageBox.Show("Es fecha valida");
            }
        }

        private bool IsDate(string fecha)
        {
            DateTime dt;
            return DateTime.TryParse(fecha, out dt);
        }

------------------------------------------
Lo que se puede imaginar... se puede programar

IsNumeric en C#

La función isNumeric en C# no existe, pero podemos utilizar el tryparse para emular esta función de Visual Basic.


Aquí les dejo un ejemplo de como utilizarla:


   private static bool IsNumeric(string value)
   {
      int number;
      return Int32.TryParse(value, out number);
   }


--------------------------------------------------------
Lo que se puede imaginar... se puede programar

miércoles, 30 de noviembre de 2011

Leer un archivo de texto mediante System.IO


Hoy veremos cómo leer un archivo de texto y almacenarlo en un ArrayList mediante la librería System.IO.
Para cargar y leer un archivo de texto desde Visual C# .NET, siga estos pasos:


  • Haga referencia a namespace System.IO y System.Collections para poder leer el archivo y manejar los ArrayList.

using System;
using System.IO;
using System.Collections;

  • Para abrir un archivo y leerlo, cree una nueva instancia de un objeto StreamReader y pase la ruta del archivo en el constructor de la siguiente manera:

StreamReader objReader = new StreamReader("c:\\test.txt");

  • Necesitará una variable de cadena en la que almacenar cada una de las líneas del archivo a medida que avanza en el proceso. Puesto que agregará estas líneas a un objeto ArrayList, debe declarar y crear un objeto de este tipo también.

string sLine="";ArrayList arrText = new ArrayList();

  • Existen varios métodos para leer el archivo, incluido el método ReadToEnd que lee todo el archivo de una vez. Sin embargo, para este ejemplo, puede utilizar el método ReadLine para que las líneas del archivo se muestren de una en una. Al llegar al final del archivo, este método devuelve un valor nulo, lo que permite terminar el bucle. Mientras lee cada línea del archivo, puede utilizar el método Add de ArrayList para insertar las líneas en la clase ArrayList.

while (sLine != null){sLine = objReader.ReadLine();if (sLine != null) arrText.Add(sLine);}objReader.Close();

  • Utilice un bucle For Each para escribir el contenido del objeto ArrayList recién llenado en la consola de la siguiente manera (el arraylist puede ser utilizado dependiendo de tu funcionalidad):

foreach (string sOutput in arrText)Console.WriteLine(sOutput);Console.ReadLine();
Lista completa de código
using System;
using System.IO;
using System.Collections;
namespace TextFileReader_csharp
{
/// <summary>
/// Descripción de resumen para Class1.
/// </summary>
class Class1
{
static void Main(string[] args)
{
StreamReader objReader = new StreamReader("c:\\test.txt");
string sLine="";
ArrayList arrText = new ArrayList();
while (sLine != null)
{
sLine = objReader.ReadLine();
if (sLine != null)
arrText.Add(sLine);
}
                        objReader.Close();
foreach (string sOutput in arrText)
Console.WriteLine(sOutput);
Console.ReadLine();
}
}
}


Espero que esto les haya servido de ayuda.
Lo que se puede imaginar… se puede programar