Archivo de la categoría: C#

Cosas varias sobre programación con c#

Abrir un Form en cualquier pantalla utlizando C#

Virt7En la actualidad es bastante habitual el tener más de una pantalla conectado a nuestro ordenador, ya sea dos pantallas, pantalla y televisión, etc.

Esto lo podemos aprovecharlo para mostrar diferentes ventanas de nuestros programa en cada una de las pantallas.

Windows maneja los multimonitores como si fuera uno con la resolución de la suma de todos ellos, es decir, si tenemos 2 monitores con una resolución de 1024×768 cada uno, para windows la resolución de la pantalla sera de 2048×768.

Con lo que, para poder posicionar nuestro nuevo formulario en el otro monitor, le sumaríamos  la resolución de nuestro monitor al parámetro «left» de nuestro nuevo Form. Si solo utilizamos 2 monitores no hay problema, pero cuando son varios monitores y con distintas resoluciones cada uno, se complica la cosa.

Para hacernos la vida mas fácil, C#  dispone de una clase llamada «Screen» de donde podemos obtener mucha información de las pantallas que tenemos instaladas en nuestro equipo. Una de estas funciones que hay en «Screen» es «Bound», esta función nos devuelve la posición de la esquina superior izquierda, es decir, «Left» y «Top» donde empieza cada una de las pantallas.

Declaración de la variable

// Declaramos una variable para manejar los monitores
Screen[] sMonitores;
sMonitores = Screen.AllScreens;

Funcionamiento

// Posicion del formulario
fNuevo.Left = sMonitores[1].Bounds.Left;
fNuevo.Top = sMonitores[ 1].Bounds.Top;

Como siempre, cuando hacemos referencia a una lista la posición siempre empieza por «0». Si queremos referirnos al monitor 2, tendríamos que por 1.

Este ejemplo abriría nuestro nuevo formulario en la posición 0, 0 de la pantalla 2.

Si queremos posicionarlo en otro lugar de la pantalla que fuese la 0, 0, sumaríamos el desplazamiento correspondiente tanto al parámetro «Left» como al «Top».

// Posicion del formulario
fNuevo.Left = sMonitores[2].Bounds.Left + 200;
fNuevo.Top = sMonitores[2].Bounds.Top + 100;

En este otro ejemplo, el formulario se abriría en la posición 200×100 del monitor 3.

Para saber cuantos monitores tenemos funcionando en nuestro equipo podemos utilizar la siguiente función.

NumMonitoresFuncionando = sMonitor.Rank + 1

Y ya esta con esto podemos abrir nuestro Form en cualquier monitor sin preocuparnos que resolución tiene cada uno.

Preguntar antes de cerrar un programa en C#

[singlepic id=5 w=320 h=240 float=right]Muchas veces cuando cerramos nuestro programa en C# necesitamos verificar que realmente se quiere cerrar el programa. Para hacer esto solo necesitamos utilizar la función «FormClosing»

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    DialogResult dialogo = MessageBox.Show("¿Desea cerrar el programa?",
               "Cerrar el programa", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
    if (dialogo == DialogResult.No)
    {
        e.Cancel = true;
    }
    else
    {
        e.Cancel = false;
    }
}

Para cancelar el cierre de la aplicación solo tenemos que poner a «true» la función «e.cancel», esto hará que se cancele el cierre del programa.

A si de fácil y sencillo o no?

Verificar en C# el formato de una dirección de e-mail

[singlepic id=4 w=320 h=240 float=right]Cuando queremos que el usuario introduzca una dirección de e-mail en nuestro programa en C#, siempre nos queda la duda si la dirección es correcta o no. El siguiente código en C# nos permite comprobar que la dirección de e-mail que se introduzca este por lo menos en su formato correcto, es decir, «nombre»@»Dominio».»extensión». Esta comprobación no asegura que la dirección sea valida, solo que el formato introducido es el correcto.

Para hacer la comprobación nos ayudamos de la clase Regex, esta función permite mediante un patrón verificar si una cadena cumple con ese patrón  Para poder utilizar la clase Regex tenemos que añadir el siguiente nombre de espacio

using System.Text.RegularExpressions;

Código  que comprueba el formato del e-mail introducido:

public static bool ComprobarFormatoEmail(string sEmailAComprobar)
{ 
    String sFormato; 
    sFormato = "\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";
    if (Regex.IsMatch(seMailAComprobar, sFormato)) 
    {
        if (Regex.Replace(seMailAComprobar, sFormato, String.Empty).Length == 0) 
        { 
            return true; 
        } 
        else
        { 
            return false; 
        } 
    } 
    else
    { 
        return false;
    }
}

La función nos devolverá «true», si el formato del email es correcto, o «false» si el formato del email es incorrecto. Ejemplo de como trabajar con la función.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

// Para la función regex
using System.Text.RegularExpressions;

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

        public static bool ComprobarFormatoEmail(string seMailAComprobar)
        { 
            String sFormato; 
            sFormato = "\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";
            if (Regex.IsMatch(seMailAComprobar, sFormato)) 
            {
                if (Regex.Replace(seMailAComprobar, sFormato, String.Empty).Length == 0) 
                { 
                    return true; 
                } 
                else
                { 
                    return false; 
                } 
            } 
            else
            { 
                return false;
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (ComprobarFormatoEmail(tbEmail.Text) == false)
            {
                lEmailCorrecto.Text = "Dirección no valida";
                lEmailCorrecto.ForeColor = Color.Red;
            }
            else
            {
                lEmailCorrecto.Text = "Dirección valida";
                lEmailCorrecto.ForeColor = Color.Green;
            }
        }
    }
}

Puedes descargar todos los ficheros desde aquí.

 

Y esto es todo, sabiendo que el formato del email  es correcto, la siguiente comprobación seria saber si la dirección es valida, es decir, si pertenece a una cuenta real. Pero eso sera para otro post.

Como manejar el puerto serie en c#

[singlepic id=2 w=320 h=240 float=right]Para manejar el puerto serie en C# es una tarea relativamente sencilla, esto por permitirá conectarnos a infinidad de dispositivos electrónicos que utilizan este medio para comunicarse con el ordenador. La forma mas habitual de conectar nuestro programa con cualquier dispositivo electrónico (Arduino, …, etc.) suele ser mediante el puerto serie, ya sea por el tradicional RS232 o un puerto USB que funciona como un puerto serie. Para poder conectar nuestros programas hechos en c# con estos dispositivos, este nos facilita un control para poder realizar este tipo de comunicaciones. Este control es el «SerialPort». Para poder utilizarlo tenemos dos maneras, 1º arrastrándolo desde la barra de controles hasta nuestro programa o, la otra forma de crearlo es desde nuestro propio código C#. Como la primera es obvio lo que hay que hacer, paso a explicar la segunda forma.

Inicialización del control Serial Port por código en C#.

Lo primero que tenemos que hacer es añadir un nuevo «using» para agregar todos objetos relacionados con el manejo de puertos, System.IO.Ports, una vez que ya tengamos esto insertado en nuestro codigo, ya podemos pasar ha definir la variable que contendrá nuestro control Serial Port, de la siguiente manera.

// Creamos la variable para el manejo del puerto serie
SerialPort spPuertoSerie = new SerialPort(
           "COM1", 9600, Parity.None, 8, StopBits.One);

De esta forma creamos el objeto «spPuertoSerie», que le hemos paso como parametros:

  • Nombre del puerto: el puerto al que nos queremos conectar, en el ejemplo «COM1».
  • Velocidad de transmisión: la velocidad de trasmisión.
  • Paridad: Sirve para verificar si hay errores en la transmisión. Existen cuatro tipos posibles de paridad: par (even), impar (odd), marcada (mark) y espaciada (space). También esta permitido no usar paridad (none), como en el ejemplo.
  • Bits de datos: Es la cantidad de datos que se van ha enviar en cada paquete. Este valor puede ser 5, 7 u 8. Valor más habitual es el 8.
  • Bits de parada: Indica el final del paquete, Los valores permitidos son 1, 1.5 o 2. También vale para la sincronización de la comunicación.

También podemos crear nuestro objeto de una manera mas sencilla, si no conocemos los parámetros de la comunicación.

// Creamos la variable para el manejo del puerto serie
SerialPort spPuertoSerie = new SerialPort();

Para pasar los parámetros lo podemos hacer de esta otra forma:

// Parametros para iniciar el puerto serie
spPuertoSerie.PortName = "COM1";
spPuertoSerie.BaudRate = 9600;
spPuertoSerie.Parity = Parity.None;
spPuertoSerie.StopBits = StopBits.One;
spPuertoSerie.DataBits = 8;

Después de tener ya creado nuestro objeto que se va ha encargar de la comunicación, solo falta abrir la comunicación de la siguiente manera.

// Abrir la comunicación
spPuertoSerie.Open();

Parta cerrar la comunicación del puerto serie lo haremos de la siguiente forma.

// Cerrar la comunicación
spPuertoSerie.Close();

Y con esto ya tenemos resuelto el problema de la comunicación con los dispositivos mediante el puerto serie. Ahora solo queda la recepción y envió de los datos. Pero eso sera en otro post.

Espero que te sirva de ayuda.

Conectarse ha una base de datos MySql con C#

Para conectarse ha una base de datos en MySql lo primero que tenemos que hacer es agregar la siguiente linea a nuestro programa

using MySql.Data.MySqlClient;

Con esto agregamos todos las funciones que necesitamos para poder manejar la conexión con el servidor de MySql.

Lo siguiente que tendremos que hacer sera crear las variables que nos permitirá manejar la conexión con el servidor de MySql deseado.

MySqlConnection dbConexion1 = new MySqlConnection();

Ahora lo que tenemos que hacer es pasarle los parámetros como la dirección del servidor de base de datos, el nombre de la base datos ha la que queremos tener acceso, el nombre de usuario de la cuenta y su correspondiente contraseña. Esto se puede hacer de la siguiente manera:

String sConexion;
sConexion1 = "Server=192.168.1.4;Database=BaseDeDatos;Uid=Usuario;Pwd=contrasenya;";

Creamos una variable string, luego le pasamos los valores anteriores con el siguiente formato:

  • Server: Nombre o dirección del servidor de MySql
  • Database: Nombre de la base de datos a la que queremos tener acceso.
  • Uid: Nombre del que tiene acceso a esa base de datos.
  • Pwd: Contraseña asignada a ese usuario.

Estos campos los tendremos que separar en la cadena que le pasemos a la variable con «;».

Ahora solo tendremos que pasar la variable string  que acabamos de crear , al parámetro correspondiente en la variable de la conexión

dbConexion1.ConnectionString = sConexion1;

Despues de esto solo nos queda decirle al conector que se conecte al servidor.

dbConexion1.Open();

Si esto no produce ningún error, como usuario no reconocido, contraseña incorrecta, servidor desconocido, etc, ya tendremos acceso a la base de datos de MySql.

La verdad es que es muy sencillo, ¿A ti que te parece?

Como cambiar el nombre de las columnas de un DataGridView en C#

Siguiendo con lo explicado en el post (Leer ficheros XML a través de DataSet (c#)) al final del post se muestra un ejemplo de como leer un fichero xml con un dataset y se mostraba el contenido en un DataGribView. En este ejemplo los nombres que aparecen en las cabeceras de las columnas son los nombres de los campos que están en el fichero. Para modificar estos nombres solo hay que utilizar la siguiente función implementada dentro del objeto DataGridView

dataGridView1.Columns[0].HeaderText = "TextoAMostrarEnLaCabecera";

El numero entre corchetes en Columns, en el ejemplo 0, es el numero de la columna que vamos a cambiar el texto del encabezado. Las columnas empiezan ha enumerarse desde el 0, es decir la primera columna es la 0.

Ejemplo de funcionamiento.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace Xml_DataSet_1
{
    public partial class fLeerXmlDataSet : Form
    {
        // Objeto dataset para manejar el fichero
        // no le ponemos nombre de la base de datos para poder abrir cualquier fichero
        DataSet dsLeerFicheroXML = new DataSet();

        public fLeerXmlDataSet()
        {
            InitializeComponent();
        }

        private void bAbrirFicheroXml_Click(object sender, EventArgs e)
        {
            // Limpiamos el contenido anterior
            dsLeerFicheroXML.Clear();

            // Creamos el objeto para abrir el fichero
            OpenFileDialog odAbrirFicheroXML = new OpenFileDialog();
            // Le ponemos un filtro para ver solamente los ficheros XML
            odAbrirFicheroXML.Filter = "Ficheros Xml|*.xml";

            // Montramos el dialogo para abrir el fichero XML
            if (odAbrirFicheroXML.ShowDialog() == DialogResult.OK)
            {
                // Si se ha pulsado el boton de OK
                // Le pasamos el nombre del fichero al DataSet para abrirlo
                dsLeerFicheroXML.ReadXml(odAbrirFicheroXML.FileName);
                // Le pasamos el contenido de la primera tabla del fichero al DataGridView
                dgvLeerFicheroXML.DataSource = dsLeerFicheroXML.Tables[0];

                // cambiamos el nombre de las columnas del DataDridView
                for (int vCont = 0; vCont < dgvLeerFicheroXML.ColumnCount; vCont++)
                {
                    dgvLeerFicheroXML.Columns[vCont].HeaderText = "Columna " + (vCont + 1).ToString();
                }
            }
        }
    }
}

Fácil, No?

Leer ficheros XML a través de DataSet (c#)

Para leer un fichero xml en c# se puede utilizar los componentes de manejo de base de datos. Esto facilita enormemente su manejo.

Ejemplo de un fichero XML.

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<NombreBaseDeDatos>
  <NombreTabla1>
    <NombreCampo1>Campo 1 Registro 1 Tabla 1</NombreCampo1>
    <NombreCampo2>Campo 2 Registro 1 Tabla 1</NombreCampo2>
    <NombreCampo3>Campo 3 Registro 1 Tabla 1</NombreCampo3>
    <NombreCampo4>Campo 4 Registro 1 Tabla 1</NombreCampo4>
  </NombreTabla1>
  <NombreTabla2>
    <NombreCampo1>Campo 1 Registro 1 Tabla 2</NombreCampo1>
    <NombreCampo2>Campo 2 Registro 1 Tabla 2</NombreCampo2>
    <NombreCampo3>Campo 3 Registro 1 Tabla 2</NombreCampo3>
    <NombreCampo4>Campo 4 Registro 1 Tabla 2</NombreCampo4>
  </NombreTabla2>
  <NombreTabla1>
    <NombreCampo1>Campo 1 Registro 2 Tabla 1</NombreCampo1>
    <NombreCampo2>Campo 2 Registro 2 Tabla 1</NombreCampo2>
    <NombreCampo3>Campo 3 Registro 2 Tabla 1</NombreCampo3>
    <NombreCampo4>Campo 4 Registro 2 Tabla 1</NombreCampo4>
  </NombreTabla1>
</NombreBaseDeDatos>

Formato como se guarda la información en el fichero XML. El fichero en si es la base de datos, este puede contener una base de datos o varias, dentro de este están las posibles tablas que pudiera tener esa base de datos. Y estas a su vez contendrá los registros que tenga cada una de las tabla con sus respectivos campos.

Lectura de fichero XML

Para leer el fichero XML lo primero tendremos que crear un objeto del tipo «DataSet» para que maneje el fichero. Hay dos formas de crearlo, sabiendo como se llama  nuestra base de datos o no.

Sin saber como se llama la base de datos:

// Crear el objeta DataSet sin conocer el nombre de la base de datos
DataSet dataSet1 = new DataSet();

Esto permite ver cualquier contenido del fichero.

Conociendo como se llama la base de datos:

// Crear el objeta DataSet conociendo el nombre de la base de datos
DataSet dataSet1 = new DataSet("NombreDeLaBaseDeDatos");

De esta otra forma solo se podrán manejar los datos que estén dentro de esa base de datos. Teniendo creado el objeto DataSet solo queda asignarle el nombre que tiene el fichero XML.

dataSet1.ReadXml("RutayNombreDelFicheroXML");

Con esto ya tenemos configurado nuestra DataSet para leer los datos del fichero. A partir de aqui, se maneja de la misma forma que cualquier otro DataSet que funcione con cualquier otro tipo de base de datos.

Ejemplo de funcionamiento.

Se lee el fichero y se muestra en un DataGridView

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace Xml_DataSet_1
{
    public partial class fLeerXmlDataSet : Form
    {
        // Objeto dataset para manejar el fichero
        // no le ponemos nombre de la base de datos para poder abrir cualquier fichero
        DataSet dsLeerFicheroXML = new DataSet();

        public fLeerXmlDataSet()
        {
            InitializeComponent();
        }

        private void bAbrirFicheroXml_Click(object sender, EventArgs e)
        {
            // Limpiamos el contenido anterior
            dsLeerFicheroXML.Clear();

            // Creamos el objeto para abrir el fichero
            OpenFileDialog odAbrirFicheroXML = new OpenFileDialog();
            // Le ponemos un filtro para ver solamente los ficheros XML
            odAbrirFicheroXML.Filter = "Ficheros Xml|*.xml";

            // Montramos el dialogo para abrir el fichero XML
            if (odAbrirFicheroXML.ShowDialog() == DialogResult.OK)
            {
                // Si se ha pulsado el boton de OK
                // Le pasamos el nombre del fichero al DataSet para abrirlo
                dsLeerFicheroXML.ReadXml(odAbrirFicheroXML.FileName);
                // Le pasamos el contenido de la primera tabla del fichero al DataGridView
                dgvLeerFicheroXML.DataSource = dsLeerFicheroXML.Tables[0];
            }
        }
    }
}

Envio de SMS mediante c# y comandos AT

Para enviar mensaje SMS, hace falta un módem o teléfono que soporte envió de sms, conexión con el ordenador, ya sea mediante bluetooth, usb o puerto serie. Los módem gsm soportan comandos AT, eston permiten configurar y obtener diversa información del módem gsm, como puede ser marca, modelo, nivel de cobertura, proveedor de la conexión, realizar llamadas, etc.

Para mas información sobre los comandos at del puede ver la pagina de la Wikipedia » Conjunto de comandos AT».
Para poder comunicarnos desde nuestro programa en C# con el módem o teléfono necesitamos el componente «SerialPort». Esto componente nos permite realizar comunicación mediante puerto serie.
Creación e inicialización del componente SerialPort
sModem = new SerialPort("COM1",9600, Parity.None, 8, StopBits.Two);
Donde:
  • Com1: es el puerto donde esta conectado el módem o teléfono gsm
  • 9600: Velocidad a la que nos conectaremos al aparato.
  • Parity.None: Paridad ninguna.
  • 8: Tamaño del bit de datos.
  • StopBits.Two: Bits de parada, en este caso 2.

Estos parámetros hay cambiarlos por los que específicos del módem al que vamos ha conectarnos.

Ejemplo de función:

// Función para mandar sms
public Boolean EnviarMensaje(string NumTel, string Mensaje)
{
    try
    {
        // Comando de comprobación                
        sModem.Write("AT\r");
        // Pasamo a modo SMS
        sModem.Write("AT+CMGF=1\r");
        // Enviamos el numero al que queremos enviar el SMS
        sModem.Write("AT+CMGS=\"" + NumTel.Trim() + "\"\r");
        // El texto del mensaje, se termina con Control+Z
        sModem.Write(Mensaje.Trim() + '\x001a');
        // Si todo sale bien devuelve true
        return true;
    }
    catch (Exception Error)
    {
        // si hay algún error devuelve false
        return false;
    }
}