Category: C#

Sep 28 2007

.NET: Validar que introducimos números enteros en un TextBox (2ª parte), o como usar int.TryParse

Ayer veíamos como hacer que el TextBox admitiese sólo caracteres numéricos, pero… como bien nos indica Rafael Vargas en su comentario al post de ayer, se nos olvidó que, los chicus malos los hay por todas partes, y, aunque evitábamos el Ctrl-C Ctrl-V, no evitabamos el copiar-pegar que se realiza con el ratón, por lo que la TextBox podía contener caracteres alfanuméricos.

La solución viene por implementar el evento Validating del TextBox, utilizando para ello el método que aparece en la versión 2.0 de .NET FrameWork int.TryParse(string s, out int Result), el cual, Convierte la representación en forma de cadena de un número en el entero de 32 bits con signo equivalente. Un valor devuelto indica si la operación tuvo éxito. Usease, si lo que contiene el parámetro de tipo string s es un número, te devuelve dicho número en el parámetro de salida Result, en cambio, si no es un número, el parámetro de salido Result devolverá cero. A todo esto, int.TryParse() en un método estático de tipo booleano que devuelve true si s se convirtió correctamente; en caso contrario, false.

Resumiendo, en mi clase Utilidades, me he creado un método estático al que llamo desde el evento Validating del TextBox. El código del método estático es el siguiente:

public static string EsNumero(string MiTexto)
{
int Result = 0;
if(!int.TryParse(MiTexto, out Result))
MiTexto = "";
return MiTexto;
}

Ala, a seguir currando gañanes, que ya es viernes, iujuuuuu!!!! ;)

Sep 27 2007

.NET: Validar que introducimos números enteros en un TextBox

En una aplicación que estoy desarrollando, me he visto en la necesidad, en uno de los TextBox, de que sólo admita números enteros, ya que, en este TextBox, guardo el código postal del cliente.

Pues bien, para ello me he creado, en una clase que tengo de utilidades, en un proyecto aparte al que referencio desde el proyecto en cuestión, un procedimiento estático al que llamo desde el evento KeyPress del TextBox en cuestión. El código de dicho procedimiento estático es el siguiente:

public static void EsEntero(KeyPressEventArgs e)
{
if ((e.KeyChar >= 47 && e.KeyChar <= 58) || (e.KeyChar==8) )
{
e.Handled = false;
return;
}
else
{
e.Handled = true;
return;
}
}

De esta forma sólo admito números y el backspace, comprobando el valor ascii de la tecla pulsada, cuando introduzco datos en el TextBox.

Sep 25 2007

.NET: Uso de StartupPath o cómo saber la ruta de mi ejecutable

En una aplicación que estoy haciendo me he visto en la necesidad de saber en tiempo de ejecución la ruta desde la que se lanza el .exe de mi aplicación, ya que tengo ahí almacenados varios XML que tengo que utilizar. Pues bien, una vez más, el Framework de .NET nos lo soluciona. Sólo tenemos más que cargar en una variable de tipo string la propiedad StartupPath de la clase Application que está en el espacio de nombres System.Windows.Forms, la cual obtiene la ruta de acceso del archivo ejecutable que inició la aplicación, sin incluir el nombre del archivo ejecutable.

string MiPath = System.Windows.Forms.Application.StartupPath;

Cada día me gusta más el .NET este ;)

Sep 17 2007

.NET: El DataBoundItem o como coger la Row de nuestro dataGridView

En una aplicación que estoy haciendo, tengo un formulario con un dataGridView que contiene los datos de la tabla Clientes de la BBDD, el cual, lo he rellenado a través de un dataset tipado que me he creado al efecto. Este formulario me debe devolver el ID del cliente al hacer dobleclick en una de las filas del dataGridView.

Para ello utilizo la propiedad DataBoundItem del dataGridView, el cual, obtiene el objeto enlazado a datos que ha rellenado la fila, y esto lo programo en el evento CellDoubleClick del datagridView de la siguiente forma, donde el DSOpolin es el dataset tipado:

private void dataGridView1_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{
DataRowView MiRowView = (DataRowView)this.dataGridView1.CurrentRow.DataBoundItem;
DSOpolin.ClientesRow MiRow = (DSOpolin.ClientesRow)
MiRowView.Row;
string MiId = MiRow.IdCliente.ToString();
}

Sep 10 2007

.NET: Uso del ToolTip o que salga la ventanita con texto al pararme en un control

Muchas veces, en nuestras aplicaciones, queremos que, al dejar el ratón encima de un control, nos aparezca la típica ventanica amarilla con un texto que indique qué es lo que hace ese objeto o lo que queramos. Pues bien, la forma de hacerlo es utilizando el objeto ToolTip.

ToolTip

Una vez lo hayamos añadido a nuestro formulario, todos los objetos del formulario contendrán una nueva propiedad llamada ToolTip en ToolTip1, que podremos ver en la ventana de propiedades del objeto que aparece en la vista diseño del VS2005.

ToolTip

No tenemos más que poner el texto que queramos, para que, una vez ejecutada la aplicación, dicho texto aparezca cuando pongamos el ratón encima. En el ejemplo se lo he puesto al botón aceptar de un formulario que me he creado al efecto.

ToolTip

El objeto tiene unas cuantas propiedades para indicarlo cuando debe salir etc…

ToolTip

Pero esto ya os lo dejo para vuestro deleite, que no os lo voy a dar todo hecho ;)

Sep 05 2007

.NET: Uso del ContextMenuStrip

Muchas veces nos vemos en la necesidad de añadir un menú contextual a algún objeto de nuestra aplicación. La solución viene por usar el ContextMenuStrip que nos proporciona el VS2005.

ContextMenuStrip

Para usarlo debemos añadirlo al formulario en el cual este el objeto al que se lo queremos añadir. Una vez añadido, aparecerá en la parte de abajo de la vista diseño de nuestro formulario y lo seleccionamos.

ContextMenuStrip

Una vez seleccionada, nos aparecerá en nuestro formulario, como se puede apreciar en la imagen de arriba, donde le meteremos el menú que queremos que aparezca. Y luego ya programamos el evento Click de cada entrada del menú para que haga lo que queramos que haga.

Luego se lo tenemos que añadir al objeto que queremos que tenga este menú contextual, en nuestro caso el NotifyIcon del otro día. Para ello vamos a la vista diseño, y en las propiedades aparecerá la propiedad ContextMenuStrip en formato combo, seleccionando el ContextMenuStrip que hemos creado.

NotifyIcon Propertys

Y cuando ejecutemos el programa, nos quedará tal que así:

ContextMenuStrip
Sep 04 2007

.NET: Como hacer que un formulario sea hijo de un MDI

He empezado ha hacerme una aplicación para gestionar la biblioteca de casa, por un lado, para poner en práctica lo que aprendo en el curso y, por otro, que ya he extraviado varios libros por no saber quien se los llevo :(

Lo primero que he hecho es crearme un formulario que hará de MDI, es decir, un formulario desde el cual gestionar el resto de formularios de la aplicación. Pues bien, depués de comerme la cabeza un poco, y de buscar por las propiedades del formulario, al final descubrí como hacerlo. Basta con ponerle al formulario MDI la propiedad IsMdiContainer a true, y añadirle un MenuStrip, o un ToolStrip con lo que llamaremos al formulario hijo (en este caso hemos creado un formulario llamado Propiedades). La llamada a este formulario la haremos por código tal que así:

Propiedades MiForm = new Propiedades();
MiForm.MdiParent = this;
MiForm.Show();

En la que, en la propiedad MdiParent, le decimos quien es su MDI. Así de sencillo.

Sep 03 2007

.NET: Leer un XML en C#

El otro día hablamos de como crear y escribir un archivo XML en C#. Pues bien, hoy nos toca hacer lo contrario, leerlo.

La forma de hacerlo es sencilla, utilizaremos el mismo XML que utilizamos en el post anterior, usease, este:

<XClub>
<Pelicula>
<Data Titulo="Garganta Profunda(Deep Throat)" Director="Gerard Damiano" />
</Pelicula>
</XClub>

Para ello no tenemos más que recorrer nodo a nodo el XML e ir leyendo lo que nos interese:

System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
doc.Load(pRutaGuardarXML);
System.Xml.XmlNode primerHijo = doc.SelectSingleNode("./descendant::XClub");
System.Xml.XmlNodeList ListaPelicula = primerHijo.SelectNodes("./descendant::Pelicula");
foreach (System.Xml.XmlNode UnaPeli in ListaPelicula)
{
System.Xml.XmlNodeList DatosPelicula = UnaPeli.SelectNodes("./descendant::Data");
foreach (System.Xml.XmlNode Datos in DatosPelicula)
{
string Titulo = Datos.Attributes["Titulo"].InnerText;
string Director = Datos.Attributes["Director"].InnerText;
}
}

Como veis, primero me creo un objeto System.Xml.XmlDocument en el que cargo el XML con el método Load(string URL). Y como me conozco la estructura del XML, la voy recorriendo y meto los datos que me interesan en un par de variables. Naturalmente, en vez de variables, tendréis que decidir donde almacenar los datos, pero eso ya depende de vuestra aplicación y de como lo estéis desarrollando, que yo, ya ahí, no me meto ;)

¿Que qué es el ./descendant::Pelicula? Os habéis fijau, eh? jiji. Pues es la forma de decirle que recorra el interior del nodo que le indiquemos de forma recursiva y me coja todos los nodos dentro de ese nodo de un nombre determinado. En el primer caso le indicamos que me coja el nodo XClub (es el nodo padre, por lo que sólo hay un nodo con ese nombre) que halla dentro del objeto System.Xml.XmlDocument doc poniéndolos en el objeto System.Xml.XmlNode primerHijo, y luego dentro de este, usea, en el nodo XClub, que me coja todos los nodos Pelicula, poniéndolos en el objeto System.Xml.XmlNodeList ListaPelicula, la cual recorreremos para… bueno, creo que ya cogéis por donde va el asunto.

Dudas, preguntas, bugs… en comentarios ;)

Aug 30 2007

.NET: El NotifyIcon o como poner tu programa al lado del reloj de Windows

En el curso, el otro día, quise poner el programa en el área de notificación, a la derecha de la barra de tareas de Windows, en tiempo de ejecución, usease, al lado del reloj de nuestro WindowsXP.

Para ello, tenemos que añadir al formulario el control NotifyIcon, que encontraremos dentro del Cuadro de Herramientas de VS2005, en Controles Comunes.

NotifyIcon

Una vez añadido, le ponemos que sea visible, le asignamos un icono (en mi caso una calavera ;) y le añado un texto que se mostrará cuando tenga el ratón encima. También le he añadido un ContextMenuStrip (ya hablaremos de él otro día) para que, cuando clickee encima, me salgan un menú con varias opciones, como podéis ver en las propiedades del control:

Propiedades NotifyIcon

De esta forma, cuando ejecutemos el programa nos aparecerá lo siguiente (si ponemos el ratón encima aparecerá el texto que le hemos puesto):

NotifyIcon resultado

Y nos queda la mar de chulo ;)

Aug 28 2007

.NET: Como cargar un DropDowmList o como jugar con combos en ASP.NET con C#

Como os decía ayer, estamos emulando un buscador de viajes de la web. Pues bien, como os imaginareis, tenemos un combo con el mes de salida, y cuando modificamos este, tenemos que modificar el combo del mes de llegada, poniendo el mismo mes que el de salida + 12.

Para ello, lo primero es activar el postback del combo del mes de salida:

postback DropDowmList

Una vez activado, programamos el evento SelectedIndexChanged del combo del mes de salida. Pero antes, un apunte, en el evento Page_Load de la página, cuando he cargado el combo, lo he hecho de la siguiente forma:

protected void AniadirMes()
{
DateTime Hoy;
for (int i = 0; i < 12; i++)
{
Hoy = DateTime.Now.AddMonths(i);
ListItem MiMes = new ListItem(Hoy.ToString("MMM yyyy"), Hoy.ToLongDateString());
//ddlMesLLegada.Items.Add(MiMes);
ddlMesSalida.Items.Add(MiMes);
}
}

De esta forma, en el value del combo me guardo la fecha, así cuando llamo al evento SelectedIndexChanged del mismo, tengo la fecha seleccionada en el value, así no me como la cabeza para saber de que mes estoy hablando ;).

Como ibamos, una vez que modifiquemos el combo, saltará dicho evento, en el cual tengo lo siguiente:

ddlMesLLegada.Enabled = true;
ddlMesLLegada.Items.Clear();
DateTime Salida = DateTime.Parse(ddlMesSalida.SelectedValue);
DateTime Hoy;
for (int i = 0; i < 12; i++)
{
Hoy = Salida.AddMonths(i);
ListItem MiLista = new ListItem(Hoy.ToString("MMM yyyy"), Hoy.ToLongDateString());
ddlMesLLegada.Items.Add(MiLista);
}

Y de esta forma cargo el segundo combo a partir del primer combo.