JASoft.org

Validación de direcciones IP

Validación de direcciones IP
Para validar una dirección IP (del estilo xxx.xxx.xxx.xxx) introducida por un usuario disponemos de multitud de opciones: desde analizar la cadena separándola por los puntos hasta utilizar expresiones regulares. Sin embargo en .NET hay una forma muy fácil de conseguir lo mismo sin complicarnos la vida y es utilizar la clase IPAddress del espacio de nombres System.Net. Ésta posee un método Parse que aunque su objetivo es obtener una instancia de la clase a partir de una cadena que represente una IP, si bien la podemos utilizar indirectamente para simplemente validar este tipo de cadenas. De este modo una función que nos permite validar una IP contenida en una cadena de texto podría tener el siguiente aspecto:  private static bool ValidaIP(string sIP) {  try  {   IPAddress ip = IPAddress.Parse(sIP);  }  catch  {   return false;  }  return true; } Ésta devuelve un booleano indicando si la IP es válida. Así de sencillo y sin necesidad de implementar análisis de cadenas o escribir una e... [Más]

Traductor de código en C# a Visual Basic .NET

Traductor de código en C# a Visual Basic .NET
Esta estupenda utilidad en-línea de Alex Lowe puede resultar muy útil a muchos programadores. Se trata de un traductor que convierte de forma automática código escrito en C# a código VB.NET. No hace falta instalar nada para usarlo, sólo hay que conectarse a Internet, pegar el código en C# en un área de texto y pulsar un botón. ¡Ya está!. Como bien pone el autor en su página, la traducción no es perfecta. Eso sí, el resultado es muy bueno. Yo lo he probado traduciendo código bastante largo y complejo en C#. Aunque el resultado en VB no compilaba a la primera, no se trataba de nada que no se pudiera arreglar con un buen Option Strict Off y cuatro ajustes manuales. Sólo traduce código C# puro (no admite etiquetas HTML por el medio si copiamos de una aplicación Web). Dan Wahlin ha escrito una interfaz para poder usar la herramienta a través de un servicio Web. En la propia página hay un enlace a esta información. Puedes encontrarlo en la Web de ASPAlliance.

Cómo obtener los nombres de una enumeración

Cómo obtener los nombres de una enumeración
En muchos programas se suelen dar a los usuarios una serie de opciones para que escoja. Por ejemplo un tipo de búsqueda a realizar, un rango de posibles valores para parametrizar algún comportamiento, etc... Lo más habitual es que estas opciones se "mapeen" después a elementos de una enumeración en el código de la capa de negocio. De esta forma si definimos una enumeración similar a esta: public enum EstadoCivil{  Casado,  Soltero,  Divorciado,  Viudo,  Religioso,} lo más común será que en la interfaz de usuario exista un modo de seleccionar algún valor equivalente, por ejemplo a través de una lista desplegable o un conjunto de botones de radio. Es bastante común generar los elementos de la interfaz manualmente, añadiendo opciones a una lista Web, por ejemplo, con código similar a este: lista.Items.Add(new ListItem("Casado", "0");lista.Items.Add(new ListItem("Soltero", "1");etc... Sin embargo sería muy útil poder añadir automáticamente los valores de una enumeración cualquier... [Más]

Cómo averiguar si una ventana ha sido cerrada por el usuario

Cómo averiguar si una ventana ha sido cerrada por el usuario
Las ventanas de Windows (formularios Windows Forms) se pueden cerrar bien por parte del usuario, bien mediante programa con el método Close(). Pero ¿cómo distinguir ambos casos? En Visual Basic 6 era muy fácil hacerlo dentro del evento QueryUnload gracias al parámetro UnloadMode. Sin embargo en .NET no es tan sencillo averiguarlo. Hoy nos ha surgido la necesidad en un trabajo y lo cierto es que no tenía ni idea ya que suelo trabajar más con WebForms, que no se cierran ;-) Aunque no es tan flexible como el evento QueryUnload mencionado esta solución hace el trabajo. Se trata de subclasificar el procedimiento de la ventana (mira mi post sobre Subclasificación de ventanas en .NET) y verificar que el mensaje que se está produciendo es WM_SYSCOMMAND con el parámetro SC_CLOSE, así: public const int SC_CLOSE = 0xF060; public const int WM_SYSCOMMAND = 0x0112;  protected override void WndProc(ref System.Windows.Forms.Message m) {       if(m.Msg == WM_SYSCOMMAND && (int)m.WParam ==... [Más]

Estupendo complemento: Gestor de regiones para VS.NET 2003

Estupendo complemento: Gestor de regiones para VS.NET 2003
Si, al igual que yo, eres de los maniáticos del orden y la claridad (sobre todo cuando programas) este programa te va a encantar. Se trata de un complemento (add-in) para Visual Studio .NET 2003 que permite gestionar de forma sencilla cómo se coloca el código dentro de regiones, tanto con C# como con VB. Tras haberlo instalado cuando seleccionemos cualquier porción de código podremos hacer que éste pase a formar parte automáticamente de una nueva sección o bien de una existente. soporta incluso secciones anidadadas por lo que no hay pega que achacarle. Lo puedes descargar junto con una breve explicación de su funcionamiento e instalación desde este artículo de CodeProject (excelente página, por cierto).

Problemas al consumir DataSets con tipo en WSE2

Problemas al consumir DataSets con tipo en WSE2
Me he topado con este problema ayer trabajando con un servicio Web y creo que es lo suficientemente interesante como para comentarlo aquí. Cuando se crea un servicio Web con Visual Studio .NET empleando los Web Services Enhancements 2.0 (para seguridad, enrutado o cualquier otra característica avanzada soportada por estos componentes), se puede producir un problema al consumir desde una aplicación cliente algún método del servicio que devuelve un DataSet tipado. Una vez habilitado WSE 2.0 en el proyecto, al añadir una referencia Web al servicio web que vamos a consumir, se crean dos proxy a dicho servicio. Uno de ellos es el normal de toda la vida que crea Visual Studio y que se llama como el servicio que hemos añadido, y otro es un proxy que permite sacar partido a las características de WSE y que se llama NombreServicioWse (con el apéndice Wse al final). Resulta que las versiones de WSE 2.0 anteriores a la 2.0.04168.1 generan mal el proxy y los métodos que deberían devolver un Da... [Más]

Nada se crea ni se destruye, sólo se transforma... Excepto las cadenas en .NET

Nada se crea ni se destruye, sólo se transforma... Excepto las cadenas en .NET
La máxima que encabeza este artículo es bien conocida en la naturaleza. Lo que ocurre es que en .NET hay algunas clases que parece que actúen contra-natura. Bromas aparte me gustaría hacer mención aquí a un comportamiento de las cadenas de texto en .NET que, si bien bastante lógico, puede que despiste a más de uno si no se lo han hecho notar nunca. Consideremos el siguiente código, tan sencillo: MiClase c1 = new MiClase();MiClase c2 = c1; Cuando en .NET hacemos esto la variable 'c2' contendrá una referencia a 'c1'. Si ahora, por el motivo que sea, transformamos los datos encapsulados en el objeto 'c1' o incluso si cambiamos el objeto al que referencia esta variable, 'c2' seguirá siendo idéntica a 'c1', es decir seguirá referenciando el mismo objeto al que referencie a su vez 'c1'. Sin embargo hagamos algo similar con una cadena de texto: string s1 = "Hola Pepe";string s2 = s1;s1 = s1.Replace("Pepe", "Paco");Console.WriteLine(s1);Console.WriteLine(s2);Console.ReadLine(); Según... [Más]

Cómo obtener los roles a los que pertenece un usuario

Cómo obtener los roles a los que pertenece un usuario
El otro día estaba jugueteando con la seguridad de una aplicación Windows escrita en .NET, utilizando las clases WindowsPrincipal y WindowsIdentity para probar algunas cosas. El caso es que me parece estupendo que WindowsPrincipal disponga de un método IsInRole que nos permite saber si el usuario que representa se encuentra dentro de un grupo de usuarios o no. Sin embargo me parece un error que no ofrezca propiedad o método alguno para obtener directamente la lista de todos los grupos/roles a los que pertenece el usuario. Creo que sería mucho más cómodo en algunas situaciones, sobre todo cuando no sabemos de antemano qué roles hay disponibles. Investigando un poco el asunto y utilizando un explorador de clases/decompilador .NET (Anakrino, en concreto) me di cuenta de que la clase WindowsIdentity dispone de un método privado llamado _GetRoles (sí, con guión bajo delante) al que se le debe pasar el token de un usuario y que devuelve una matriz de cadenas de texto. Tiene toda la pinta de... [Más]

MSDN 2: beta de la nueva documentación On-Line de la plataforma .NET 2.0

MSDN 2: beta de la nueva documentación On-Line de la plataforma .NET 2.0
Hoy me he enterado de que está accesible al público (aunque no publicitada) la versión Beta de la nueva documentación en-línea de la plataforma .NET 2.0. Se trata de la documentación y referencia de "Whidbey", o sea, de .NET 2.0, pero tiene una característica muy interesante: basta con escribir "http://msdn2.microsoft.com/library/<namespace>.aspx"  para que aparezca la documentación del espacio de nombres indicado. Así, por ejemplo, puedes escribir "http://msdn2.microsoft.com/library/System.Configuration.aspx"  para que aparezca la documentación de las clases de configuración de la plataforma. Puedes seguir profundizando e incluir a continuación nombres de clases concretas e incluso nombres de métodos. Por ejemplo, si pones http://msdn2.microsoft.com/library/System.Security.Cryptography.MD5.Create.aspx obtendrás la documentación (aún en pañales) del método 'Create' de la clase 'MD5' para cálculo de huellas digitales con este algoritmo. Ni que decir tiene la utilidad de algo as... [Más]

Más detalles acerca de los estilos visuales de Windows XP

Más detalles acerca de los estilos visuales de Windows XP
En mi "post" del día 31 de agosto (Cómo utilizar los estilos visuales de Windows XP) explicaba cómo habilitar los estilos visuales de Windows XP en aplicaciones Windows Forms con la versión 1.1 de la plataforma .NET. Por los comentarios que he recibido estos últimos días deduzco que vendría bien dar algunos consejos más.En concreto me han planteado las siguientes dudas: 1.- ¿Tengo que tener todos los controles con FlatStyle = System? Sí. Es necesario o sino no se verán con el estilo de Windows XP. Así que no queda más remedio que fijar esta propiedad en todos los controles que dispongan de ella. 2.- Menudo aburrimiento recorrer uno por uno los controles para fijar esta propiedad... ¿Puedo hacer otra cosa? Sí, puedes automatizar esta tarea. Me he tomado la libertad de escribir una pequeña rutina que hará precisamente esto. La he escrito en Visual Basic por probarla en un proyecto que estamos haciendo ahora en la empresa y que es en este lenguaje, pero traducirla a C# no reviste difi... [Más]

Este soy yo y este es mi blog técnico, dedicado al software y a la programación.

¡Sígueme en Twitter!

Mis otros blogs

- JM Alarcón @ campusMVP.es
Contenido técnico en español orientado a desarrolladores
- JMAlarcon.es
Blog personal no técnico: sociedad, innovación, empresa...

Krasis

- campusMVP.es:
Los mejores cursos online de programación en español

- SELF LMS:
La plataforma de elearning más potente del mercado.

Histórico