Archive

Posts Tagged ‘Windows Forms’

Cómo abrir un formulario y cerrar el padre en VB.NET


Casi nunca escribo cosas de VB.NET, puesto que mi lenguaje preferido en .NET es C#. Sin embargo, hoy surgió una discusión en los foros de MSDN, y creo que es algo recurrente, así que mejor hago esta pequeña entrada.

El asunto es el siguiente. Supongamos que tengo Form1 y Form2, dos formas. Al iniciar la aplicación, inicio Form1 y quiero que al hacer clic a un botón dentro de ésta, me abra Form2.

La primera aproximacion es hacer un ShowDialog:

Public Class Form1

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) _
        Handles Button1.Click

        Dim form As New Form2

        form.ShowDialog(Me)
        
    End Sub
End Class

Esto muestra la segunda forma como modal de la primera. Si quisiéramos cerrar la forma original (i.e. Form1) podríamos hacer un close:

Public Class Form1

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) _
        Handles Button1.Click

        Dim form As New Form2

        form.ShowDialog(Me)
        Me.Close()
        
    End Sub
End Class

Pero no nos sirve, porque Close no se ejecutará hasta que ShowDialog termine, es decir, hastas que Form2 se cierre. Lo que podemos hacer es invocar a Show, en lugar de a ShowDialog.

Public Class Form1

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) _
        Handles Button1.Click

        Dim form As New Form2

        form.Show()
        Me.Close()
        
    End Sub
End Class

Así, Close se ejecuta inmediatamente después de Show. Sin embargo, si haces esto ahora nos damos cuenta que al hacer clic en el botón, sí se abre momentáneamente el Form2, pero ¡se cierra la aplicación!

Había escuchado muchos argumentos de que esto era por diseño, que la forma inicial siempre debía estar corriendo, etc. Me puse a picarle al código y encontré que en las propiedades del proyecto es posible especificar la forma en la que una aplicación VB termina: si queremos que termine cuando se cierra el formulario principal o si queremos que termine cuando se cierre el último formulario.

image

Una vez que cambiamos la opción a “Cerrar cuando se cierre el último formulario” ¡el código anterior funciona a la perfección!

Tras bambalinas pude ver que el diseñador de VB.NET 2010 genera una clase llamada MyApplication, la cual tiene una propiedad: ShutdownStyle, de tipo ShutdownMode, así que las propiedades del proyecto seguramente sólo cambian ese valor.

Y dado que la documentación data de .NET Framework 2.0, supongo que esta funcionalidad está disponible desde entonces (circa 2005).

Así que ya sabes: ¡haz la prueba y deja tus comentarios!

Cómo utilizar los servicios de .NET Framework para leer canales RSS y ATOM


He añadido un código de ejemplo a la Galería de Código de MSDN, a continuación transcribo lo que publiqué. Pueden descargar el código desde aquí.

 

Introducción

 

Los canales RSS y ATOM proveen un mecanismo estándar para publicar contenido sobre sitios web, como texto, imágenes, vídeos, etc. Dichos formatos son documentos XML con una estructura predefinida. Durante cierto tiempo la solución para crear un lector para dichos formatos ha sido, en el mundo de .NET, crear el documento y analizarlo a mano. Las últimas versiones de .NET vienen con servicios para poder analizar ese contenido de forma automática. El código aquí presentado muestra cómo hacerlo.

Construcción del ejemplo

El ejemplo está construido sobre .NET Framework 4, para Visual Studio 2010. Sin embargo debe poder portarse a .NET Framework 3.5 sin mucho problema. En particular, se utiliza la biblioteca System.ServiceModel.dll, la cual contiene las clases necesarias para leer los canales RSS y ATOM.

La compilación de este ejemplo es sencilla y no necesita consideraciones especiales.

Descripción

Básicamente el proceso de lectura de un canal RSS o ATOM se da siguiendo estos pasos.

  1. Descargar el contenido XML del canal, usando un XmlReader por ejemplo.
  2. Crear un formateador. Estos pueden ser, por ejemplo, las clases Rss20FeedFormatter, o bien Atom10FeedFormatter (del espacio de nombres System.ServiceModel.Syndication), para canales RSS y ATOM, respectivamente.
  3. Pasar el objeto XmlReader al método ReadFrom del Rss20FeedFormatter o del Atom10FeedFormatter.

Una vez hecho esto, el objeto formateador habrá analizado el XML y ¡bazzinga! estamos listos. Mediante la propiedad Feed se accede al contenido del canal, la cual a su vez cuenta con la propiedad Items, que es una colección para cada uno de los elementos encontrados.

El siguiente trozo de código es un extracto, el cual muestra cómo leemos el canal y cargamos el contenido en un control TreeView.

// Creamos el formateador, el cual será RSS o ATOM, dependiendo de la opción
// seleccionada por el usuario. 
SyndicationFeedFormatter formatter = CreateFormatter();

// Leemos el XML de la URL seleccionada...
using (XmlReader reader = XmlReader.Create(_urlText.Text))
{
    // ...y le decimos al formateador que analice el XML del feed. 
    formatter.ReadFrom(reader);
}
// Si la URL es inválida, recibiremos un UriFormatException. Si el XML 
// descargado tiene algún contenido inválido, que no se ciña a la especificación
// de RSS o de ATOM, entonces recibiremos un XmlException. 

// Vaciamos el árbol y añadimos un nodo raíz. 
_feedTree.Nodes.Clear();
TreeNode rootNode = _feedTree.Nodes.Add(formatter.Feed.Title.Text);

// Para cada elemento encontrado en el feed añadimos un nodo. Adjuntamos 
// el objeto de dicho elemento a la propiedad Tag del nodo, para poder
// referirnos a éste posteriormente (i.e. cuando se dispare el evento
// NodeMouseClick). 
foreach (SyndicationItem item in formatter.Feed.Items)
{
    TreeNode feedNode = rootNode.Nodes.Add(item.Title.Text);
    feedNode.Tag = item;
}

El siguiente trozo muestra cómo cargar el contenido de un elemento del canal en una caja de texto. También es un extracto del código fuente.

SyndicationItem item = args.Node.Tag as SyndicationItem; 
if (item != null) 
{ 
    StringBuilder text = new StringBuilder() 
        .AppendFormat("Título: {0}\r\n", item.Title.Text) 
        .AppendFormat("Publicado: {0}\r\n", item.PublishDate.DateTime) 
        .AppendFormat("Actualizado: {0}\r\n", item.LastUpdatedTime.DateTime) 
        .AppendLine() 
        .AppendFormat(item.Summary.Text) 
        .AppendLine() 
        .AppendLine(); 
    if (item.Content != null) 
    { 
        text.AppendLine(item.Content.Type); 
    } 
                 
    _contentText.Text = text.ToString(); 
 
    _linkLabel.Text = item.Title.Text; 
    _linkLabel.Tag = item; 
}

A continuación, una imagen de cómo luce el programa.

Lector sencillo de rss

Código fuente

 

La solución presenta estos proyectos:

1.- SimpleRssFeed. Muestra una aplicación en Windows Forms sobre cómo utilizar los canales de comunicación RSS y ATOM. Muestra cómo emplear las clases System.ServiceModel.Syndication.Rss20FeedFormatter.

  • RssFeed.cs – el formulario principal de la aplicación.

Más información

Para más información, revisa estos enlaces en la documentación de MSDN:

Atom10FeedFormatter

Rss20FeedFormatter

SyndicationFeed

SyndicationItem