jueves, 25 de febrero de 2010

Obtener instancias de SQL Server y bases de datos disponibles desde .NET (VB.NET)

Imports System.Data
Imports System.Data.Sql
Imports System.Data.SqlClient

Public Class frmConexiones
Private servidores As SqlDataSourceEnumerator
Private tablaServidores As DataTable
Private servidor As String

Public Sub New()

' Llamada necesaria para el Diseñador de Windows Forms.
InitializeComponent()

' Agregue cualquier inicialización después de la llamada a InitializeComponent().
servidores = SqlDataSourceEnumerator.Instance
tablaServidores = New DataTable()
End Sub

Private Sub cmbServidores_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbServidores.Click

' Comprobamos que no se haya cargado ya el combobox
If tablaServidores.Rows.Count = 0 Then
' Obtenemos un dataTable con la información sobre
' las instancias disponibles de SQL Server 2000 y 2005
tablaServidores = servidores.GetDataSources()

' Creamos una lista para que sea el origen de datos
' del combobox
Dim listaServidores As List(Of String) = New List(Of String)

' Recorremos el dataTable y añadimos un valor nuevo la
' lista con cada fila
For Each rowServidor As DataRow In tablaServidores.Rows

' La instancia de SQL Server puede tener nombre
' de instancia o únicamente el nombre del servidor,
' comprobamos si hay nombre de instancia para
' mostrarlo
If String.IsNullOrEmpty(rowServidor("InstanceName").ToString()) Then
listaServidores.Add(rowServidor("ServerName").ToString())
Else
listaServidores.Add(rowServidor("ServerName") & "\\" & rowServidor("InstanceName"))
End If

Next

'Asignamos la lista de servidores como origen de datos
' del combobox
Me.cmbServidores.DataSource = listaServidores
End If

End Sub

Private Sub cmbBasesdeDatos_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbBasesdeDatos.Click

Dim listaBasesDatos As List(Of String) = New List(Of String)
Dim cadenaConexion As String
Dim selectSQL As String

' Se comprueba que haya un servidor seleccionado para
' poder conectarnos
If Me.cmbServidores.Text = "" Then
MsgBox("Debe seleccionar un servidor")
Return
End If

servidor = Me.cmbServidores.Text

'Componemos la cadena de conexión con el servidor seleccionado y
' seguridad integrada
' si la autenticación se hace con usuario y password hay
' que cambiar la cadena
cadenaConexion = "Data Source=" & servidor & " ;Integrated Security=True;Initial Catalog=master"

Using con As New SqlConnection(cadenaConexion)

' Abrimos la conexión
con.Open()

'Obtenemos los nombres de las bases de datos que
' haya en el servidor
selectSQL = "select name from sys.databases;"

Dim com As SqlCommand = New SqlCommand(selectSQL, con)
Dim dr As SqlDataReader = com.ExecuteReader()

' Recorremos el dataReader
While (dr.Read())
listaBasesDatos.Add(dr(0).ToString())
End While

'Asignamos la lista de bases de datos como origen
'de datos del combobox
Me.cmbBasesdeDatos.DataSource = listaBasesDatos

End Using
End Sub
End Class

Mostrar las Base de Datos MySql en un ComboBox

Para poder obtener las "Base de Datos" del servidor MySql en un control ComboBox es necesario tener
una conexión establecida.
Mostrar base de datos en combobox
Una ves realizada la conexión podemos utilizar el siguiente procedimiento:
   
Private Sub ObtenerBaseDeDatos(ByVal Combo As ComboBox)
        
Dim reader As MySqlDataReader
       
reader =
Nothing
        
Dim Comando As New MySqlCommand("SHOW DATABASES", Conexion)
       
Try
           
reader = Comando.ExecuteReader()
           
Combo.Items.Clear()
            
While
(reader.Read())
               
Combo.Items.Add(reader.GetString(0))
           
End
While
        
Catch ex As MySqlException
           
MessageBox.Show(
"Error al listar las bases de datos: " + ex.Message)
       
Finally
           
If
Not reader
Is
Nothing
Then
reader.Close()
       
End
Try
    
End
Sub
En este procedimiento solo hay que indicar el nombre del ComboBox en el que se mostraran las base de
datos.
 

Crear Tablas en SQL Server 2005 Script

CREATE TABLE "Institucion"(
"Nombre_i" "nvarchar"(50) NOT NULL,
CONSTRAINT "PK_Institucion" PRIMARY KEY CLUSTERED
("Nombre_i")
)
GO

CREATE TABLE "Alumno"
(
"No_control" "nvarchar" (50) NOT NULL,
"Nombre" "nvarchar" (50) NOT NULL,
"Apellidop" "nvarchar" (50) NOT NULL,
"Apellidom" "nvarchar" (50) NOT NULL,
"Especialidad" "nvarchar" (50)NOT NULL,
"Estado" "nvarchar" (50) NOT NULL,
"Nombre_i" "nvarchar" (50)NOT NULL,
CONSTRAINT "PK_Alumno" PRIMARY KEY CLUSTERED
("No_control"),
CONSTRAINT "FK_Alumno" FOREIGN KEY
("Nombre_i")REFERENCES "Institucion"("Nombre_i")
)
GO

CREATE TABLE "Profesor"
(
"Nombre_p" "nvarchar"(50)NOT NULL,
"Apellido_p" "nvarchar"(50) NOT NULL,
"Apellido_m" "nvarchar" (50)NOT NULL,
"Departamento" "nvarchar" (50) NOT NULL,
"Nombre_i" "nvarchar"(50)NOT NULL,
CONSTRAINT "PK_Profesor" PRIMARY KEY CLUSTERED
("Nombre_p"),
CONSTRAINT "FK_Profesor" FOREIGN KEY
("Nombre_i")REFERENCES "Institucion"("Nombre_i")
)
GO

CREATE TABLE "Cursos"
(
"Num_curso" "nvarchar" (50) NOT NULL,
"Titulo" "nvarchar"(50)NOT NULL,
CONSTRAINT "PK_Cursos" PRIMARY KEY CLUSTERED
("Num_curso")
)
GO

CREATE TABLE "Alumnos_cursos"
(
"No_control" "nvarchar"(50)NOT NULL,
"Num_curso" "nvarchar"(50) NOT NULL,
"Calificacion" "char" (1)NOT NULL,

CONSTRAINT "PK_Alumnos_cursos" PRIMARY KEY CLUSTERED
("No_control","Num_curso"),
CONSTRAINT "FK_Alumnos_cursos" FOREIGN KEY
("No_control")REFERENCES "Alumno"("No_control"),
CONSTRAINT "FK_Alumnos_cursos2" FOREIGN KEY
("Num_curso")REFERENCES "Cursos"("Num_curso")
)
GO


CREATE TABLE "Profesor_cursos"
(
"Nombre_p" "nvarchar" (50)NOT NULL,
"Num_curso" "nvarchar" (50)NOT NULL,
CONSTRAINT "PK_Profesor_cursos" PRIMARY KEY CLUSTERED
("Nombre_p","Num_curso"),
CONSTRAINT "FK_Profesor_cursos" FOREIGN KEY
("Num_curso")REFERENCES "Cursos"("Num_curso"),
CONSTRAINT "FK_Profesor_cursos2" FOREIGN KEY
("Nombre_p")REFERENCES "Profesor"("Nombre_p")
)
GO



INSERT INTO "Institucion" ("Nombre_i") VALUES ('Instituto Tecnologico Minatitlan')
INSERT INTO "Institucion" ("Nombre_i") VALUES ('Universidad del Sur de Nueva Jersey')

INSERT INTO "Alumno" ("No_control","Nombre","Apellidop","Apellidom","Especialidad","Estado","Nombre_i") VALUES ('05231101','Esperanza','Ubaldo','Mota','ISC','Primero','Universidad del Sur de Nueva Jersey')
INSERT INTO "Alumno" ("No_control","Nombre","Apellidop","Apellidom","Especialidad","Estado","Nombre_i") VALUES ('05231102','Leonel','Ubaldo','Mota','ISC','Primero','Instituto Tecnologico Minatitlan')
INSERT INTO "Alumno" ("No_control","Nombre","Apellidop","Apellidom","Especialidad","Estado","Nombre_i") VALUES ('05231103','Martin','Ubaldo','Mota','IQ','Primero','Instituto Tecnologico Minatitlan')
INSERT INTO "Alumno" ("No_control","Nombre","Apellidop","Apellidom","Especialidad","Estado","Nombre_i") VALUES ('05231104','Edison','Garcia','Chiñas','ISC','Sexto','Instituto Tecnologico Minatitlan')
INSERT INTO "Alumno" ("No_control","Nombre","Apellidop","Apellidom","Especialidad","Estado","Nombre_i") VALUES ('05231105','Nestor','Ubaldo','Mota','IQ','Segundo','Instituto Tecnologico Minatitlan')
INSERT INTO "Alumno" ("No_control","Nombre","Apellidop","Apellidom","Especialidad","Estado","Nombre_i") VALUES ('05231106','Anahi','Ubaldo','Mota','II','Segundo','Instituto Tecnologico Minatitlan')
INSERT INTO "Alumno" ("No_control","Nombre","Apellidop","Apellidom","Especialidad","Estado","Nombre_i") VALUES ('05231107','Isabel','Ubaldo','Mota','ADMON','Segundo','Universidad del Sur de Nueva Jersey')
INSERT INTO "Alumno" ("No_control","Nombre","Apellidop","Apellidom","Especialidad","Estado","Nombre_i") VALUES ('05231108','Teresa','Ubaldo','Mota','ADMON','Cuarto','Instituto Tecnologico Minatitlan')
INSERT INTO "Alumno" ("No_control","Nombre","Apellidop","Apellidom","Especialidad","Estado","Nombre_i") VALUES ('05231109','Guadalupe','Ubaldo','Mota','ISC','Quinto','Instituto Tecnologico Minatitlan')
INSERT INTO "Alumno" ("No_control","Nombre","Apellidop","Apellidom","Especialidad","Estado","Nombre_i") VALUES ('05231110','Miguel Angel','Ubaldo','Mota','ISC','Noveno','Universidad del Sur de Nueva Jersey')


INSERT INTO "Profesor" ("Nombre_p","Apellido_p","Apellido_m","Departamento","Nombre_i")VALUES('Felipe','Gonzalez','Hernandez','ISC','Instituto Tecnologico Minatitlan')
INSERT INTO "Profesor" ("Nombre_p","Apellido_p","Apellido_m","Departamento","Nombre_i")VALUES('Guillen','Lopez','Lopez','ISC','Instituto Tecnologico Minatitlan')
INSERT INTO "Profesor" ("Nombre_p","Apellido_p","Apellido_m","Departamento","Nombre_i")VALUES('Jose','Perez','Lopez','IQ','Universidad del Sur de Nueva Jersey')
INSERT INTO "Profesor" ("Nombre_p","Apellido_p","Apellido_m","Departamento","Nombre_i")VALUES('Juan','Toledo','Alvarez','ISC','Instituto Tecnologico Minatitlan')
INSERT INTO "Profesor" ("Nombre_p","Apellido_p","Apellido_m","Departamento","Nombre_i")VALUES('Oscar','Guillen','Joaquin','ISC','Universidad del Sur de Nueva Jersey')

INSERT INTO "Cursos" ("Num_curso","Titulo")VALUES('2134','FDS')
INSERT INTO "Cursos" ("Num_curso","Titulo")VALUES('1234','TBD')
INSERT INTO "Cursos" ("Num_curso","Titulo")VALUES('2341','PROGRAMACION WEB')
INSERT INTO "Cursos" ("Num_curso","Titulo")VALUES('1324','QUIMICA')
INSERT INTO "Cursos" ("Num_curso","Titulo")VALUES('2413','PROGRAMACION MOVIL')
INSERT INTO "Cursos" ("Num_curso","Titulo")VALUES('4144','INTERFACES')

INSERT INTO "Alumnos_cursos"("No_control","Num_curso","Calificacion")VALUES('05231101','2134','A')
INSERT INTO "Alumnos_cursos"("No_control","Num_curso","Calificacion")VALUES('05231101','1234','B')
INSERT INTO "Alumnos_cursos"("No_control","Num_curso","Calificacion")VALUES('05231101','2413','A')
INSERT INTO "Alumnos_cursos"("No_control","Num_curso","Calificacion")VALUES('05231101','4144','B')
INSERT INTO "Alumnos_cursos"("No_control","Num_curso","Calificacion")VALUES('05231102','2134','A')
INSERT INTO "Alumnos_cursos"("No_control","Num_curso","Calificacion")VALUES('05231102','2413','C')
INSERT INTO "Alumnos_cursos"("No_control","Num_curso","Calificacion")VALUES('05231102','1234','A')
INSERT INTO "Alumnos_cursos"("No_control","Num_curso","Calificacion")VALUES('05231103','2134','A')
INSERT INTO "Alumnos_cursos"("No_control","Num_curso","Calificacion")VALUES('05231103','1234','A')
INSERT INTO "Alumnos_cursos"("No_control","Num_curso","Calificacion")VALUES('05231104','2134','A')
INSERT INTO "Alumnos_cursos"("No_control","Num_curso","Calificacion")VALUES('05231105','1234','B')
INSERT INTO "Alumnos_cursos"("No_control","Num_curso","Calificacion")VALUES('05231106','1324','B')
INSERT INTO "Alumnos_cursos"("No_control","Num_curso","Calificacion")VALUES('05231107','2134','C')
INSERT INTO "Alumnos_cursos"("No_control","Num_curso","Calificacion")VALUES('05231107','2341','A')
INSERT INTO "Alumnos_cursos"("No_control","Num_curso","Calificacion")VALUES('05231107','1324','B')
INSERT INTO "Alumnos_cursos"("No_control","Num_curso","Calificacion")VALUES('05231107','2413','B')
INSERT INTO "Alumnos_cursos"("No_control","Num_curso","Calificacion")VALUES('05231107','4144','C')
INSERT INTO "Alumnos_cursos"("No_control","Num_curso","Calificacion")VALUES('05231108','2413','A')
INSERT INTO "Alumnos_cursos"("No_control","Num_curso","Calificacion")VALUES('05231108','4144','C')
INSERT INTO "Alumnos_cursos"("No_control","Num_curso","Calificacion")VALUES('05231110','2134','A')
INSERT INTO "Alumnos_cursos"("No_control","Num_curso","Calificacion")VALUES('05231110','2341','A')
INSERT INTO "Alumnos_cursos"("No_control","Num_curso","Calificacion")VALUES('05231110','4144','A')

INSERT INTO "Profesor_cursos"("Nombre_p","Num_curso")VALUES('Felipe','2134')
INSERT INTO "Profesor_cursos"("Nombre_p","Num_curso")VALUES('Felipe','1234')
INSERT INTO "Profesor_cursos"("Nombre_p","Num_curso")VALUES('Guillen','4144')
INSERT INTO "Profesor_cursos"("Nombre_p","Num_curso")VALUES('Juan','2341')
INSERT INTO "Profesor_cursos"("Nombre_p","Num_curso")VALUES('Juan','2413')
INSERT INTO "Profesor_cursos"("Nombre_p","Num_curso")VALUES('Oscar','1324')

Mantenimiento de Tablas

Sres. Desarrolladores, les envío en esta oportunidad el clásico mantenimiento de una tabla de una base de datos, es algo sencillo pero a la vez sumamente importante.
El ejemplo tiene incluido desde el IDE los objetos SQLConnection, un SQLDataAdapter y se ha generado un DataSet tipificado. Se asume que el lector conoce todos estos términos.
También se muestra como se utiliza el control ToolTip, recuerden que en los exámenes del Desarrollador Cinco Estrellas asi como en la Certificación MCSD .Net viene preguntas acerca del Control ToolTip.
Basta con uno solo para todos los controles que se les pueda especificar un mensaje.
Notas importantes:

  • El ejemplo incluye dos formas de manipular los registros de Categorías, la primera es únicamente con el uso de un grid y un botón que actualice la tabla de la base de datos con el uso del SQLDataAdapter respectivo.

  • La segunda forma es incluyendo los clásicos botones de navegación entre registros y los botones Insertar, Modificar, Actualizar y Eliminar.

  • El ejemplo muestra en el mismo Form las dos opciones.

  • Les envío además un archivo de Word en Versión Imprimible.
A continuación sigue código en Visual Basic:
'Importar el NameSapce para los datos con SQL Server 2000 Imports System.Data.SqlClient
Public Class Categorias    Inherits System.Windows.Forms.Form
    'CREAR EL Adaptador, el DataSet y el Entero para la Posición
    Private daCat As SqlDataAdapter    Private dsCatCod As DataSet    Private iPosicion As Integer
    'Este DataTable es para el Mantenumiento con todos los botones.
    Private CategoriasCod As DataTable
#Region " Código generado por el Diseñador de Windows Forms "
           
*** CODIGO ELIMINADO#End Region
    'CUANDO CARGA EL FORMULARIO  --- LOAD
    Private Sub CargarForm(ByVal sender As Object, _
        ByVal e As System.EventArgs) Handles MyBase.Load
        'LLENAR EL DATATABLE CON LOS DATOS DEL DATASET
        daCategorias.Fill(dsCat, "Categorias")       'ENLAZAR EL GRID CON EL DATATABLE CREADO
        grdCategorias.DataSource = dsCat.Tables("Categorias")
        grdCategorias.CaptionText = "Categorias Registradas"
        ' **********************************************************'
        'Esta seccion el para el Mantenimiento por código
        'CREAR LA CONEXION        Dim cn1 As New SqlConnection()
        'ESTABLECER LA CADENA DE CONEXION        cn1.ConnectionString = "data source=HOME;" & _                        "initial catalog=Northwind;" & _                        "integrated security=SSPI;" & _                        "persist security info=False;" & _                        "user id=sa;workstation id=HOME;packet size=4096"
        'CREAR EL ADAPTADOR  daCat = New SqlDataAdapter("Select CategoryId,CategoryName,Description from Categories", cn1)
        'CREAR EL COMMANDBUILDER        'ESTE OBJETO PERMITE CREAR LOS COMANDOS DEL ADAPTADOR        Dim cbCat As New SqlCommandBuilder(daCat)
        'Crear una nueva instancia del DataSet        Me.dsCatCod = New DataSet()
        'Abrir la Conexion        cn1.Open()
        'Llenar el DataSet        Me.daCat.Fill(dsCatCod, "CategoriasCod")
        'Cerrar la conexion        cn1.Close()
        'Indicador de registros a 0        Me.iPosicion = 0
        'Cargar los datos del registro a las cajas de texto        Me.CargarDatos()
        'DataSource del Grid por Código        grdCatCod.DataSource = Me.dsCatCod.Tables("CategoriasCod")
        grdCatCod.CaptionText = "Categorias - Código"        grdCatCod.ReadOnly = True
    End Sub
    'MUESTRA LOS DATOS DEL REGISTRO ACTIVO EN LAS CAJAS DE TEXTO    Private Sub CargarDatos()
       'DEFINIR UN DATAROW       Dim drFila As DataRow
        'ASIGNAR LOS DATOS DEL PRIMER REGISTRO AL DATAROW        drFila = dsCatCod.Tables("CategoriasCod").Rows(Me.iPosicion)
        'LLENAR LAS CAJAS DE TEXTO CON LOS DATOS DEL DATAROW
        Me.txtIdCat.Text = drFila("CategoryID")
        Me.txtNombreCat.Text = drFila("CategoryName")
        Me.txtDescCat.Text = drFila("Description")
        'ACTUALIZAR LA ETIQUETA "Registro..... de ......"
        Me.lblPosicion.Text = "Registro " & CType(Me.iPosicion + 1, String) & _
            " de " & Me.dsCatCod.Tables("categoriasCod").Rows.Count
    End Sub
 

    'ACTUALIZACION DESDE EL IDE
    Private Sub ActualizaGrid(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdActualizar.Click         daCategorias.Update(dsCat, "Categorias")     End Sub
    Private Sub cmdPrimero_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdPrimero.Click         'PRIMER REGISTRO DE LA TABLA         Me.iPosicion = 0         CargarDatos()     End Sub
    Private Sub cmdUltimo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdUltimo.Click
        'ULTIMO REGISTRO DE LA TABLA         Me.iPosicion = Me.dsCatCod.Tables("CategoriasCod").Rows.Count - 1         CargarDatos()
    End Sub
    Private Sub cmdAnterior_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles cmdAnterior.Click
        'REGISTRO ANTERIOR
        If Me.iPosicion = 0 Then
            MessageBox.Show("Primer registro...", "Atención")
        Else
            Me.iPosicion -= 1
            CargarDatos()
         End If
    End Sub
 
    Private Sub cmdSiguiente_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles cmdSiguiente.Click
        'SIGUIENTE REGISTRO
        If Me.iPosicion = Me.dsCatCod.Tables("CategoriasCod").Rows.Count - 1 Then
            MessageBox.Show("Último registro...", "Atención")
        Else
            Me.iPosicion += 1
            CargarDatos()
        End If
    End Sub
 
    Private Sub Insertar(ByVal sender As System.Object, _
            ByVal e As System.EventArgs) Handles cmdInsertar.Click
        'INSERTAR REGISTROS AL DATATABLE
        'DEFINIR EL DATAROW
        Dim FilaNueva As DataRow
        FilaNueva = Me.dsCatCod.Tables("CategoriasCod").NewRow()
        'ASIGNAR LOS VALORES CON LOS DE LAS CAJAS DE TEXTO
        FilaNueva("CategoryID") = CType(Me.txtIdCat.Text, Integer)
        FilaNueva("CategoryName") = Me.txtNombreCat.Text
        FilaNueva("Description") = Me.txtDescCat.Text
        'Agregar el Row
        Me.dsCatCod.Tables("CategoriasCod").Rows.Add(FilaNueva)
        'Deshabilitar Botones
        Me.cmdInsertar.Enabled = False
        Me.cmdActualCod.Enabled = True
        Me.cmdModificar.Enabled = True
        Me.cmdEliminar.Enabled = True
        Me.PanelMover.Enabled = True  'Activar Panel
        Me.cmdLimpiar.Enabled = True
        DesactivarCajas()
        Me.cmdActualCod.Text = "Actualizar"
        Me.iPosicion = Me.dsCatCod.Tables("CategoriasCod").Rows.Count - 1
        Me.lblPosicion.Text = "Registro " & CType(Me.iPosicion + 1, String) & _
            " de " & Me.dsCatCod.Tables("categoriasCod").Rows.Count
    End Sub

martes, 23 de febrero de 2010

Manejar formularios hijos en aplicaciones MDI con VB2005

Introducción

Uno de los muchos cambios de este menú, es que ahora la forma de indicar que un menú hará de lista de ventanas hijas ha cambiado, de forma que ahora no es el "elemento" del menú el que tiene la propiedad para indicarlo, sino que es el propio MenuStrip mediante la propiedad MdiWindowListItem en la que indicaremos el menú que queremos usar como menú de ventanas hijas.En la siguiente figura (figura 1) podemos ver cómo seleccionar el elemento "principal" de los menús añadidos para que haga de lista de ventanas:
Figura 1. Indicar el menú que contiene la lista de ventanas hijas
Figura 1. Indicar el menú que contiene la lista de ventanas hijas

Por si no sabes de que va esto de la lista de ventanas hijas, decirte que podemos tener en un menú las diferentes ventanas hijas que tenemos abiertas al estilo de como hacen otras aplicaciones, de esa forma, puedes seleccionar la ventana que quieras activar usando dicho menú, tal como se muestra en la figura 2:
Figura 2. El menú con la lista de ventanas abiertas
Figura 2. El menú con la lista de ventanas abiertas

No te voy a mostrar código, ya que en realidad el código a usar sería el mismo que en el ejemplo de Visual Basic 2003, incluso la asignación de las propiedades para crear el form principal como MDI (IsMdiContainer = True) y asignar el valor correspondiente para que los otros formularios sean "hijos" de ese formulario (MdiParent).
' Usando el método "tradicional" se muestra maximizado
' si el valor en tiempo de diseño de WindowState = Normal
' Como esté ControlBox no afecta.
'
' Crear una nueva ventana hija
Dim frm2 As New Form2()
frm2.MdiParent = Me
frm2.WindowState = FormWindowState.Maximized
frm2.Show()

Lo que si quiero aclararte es lo siguiente:
Tal como indico en los comentarios del código anterior, podemos hacer que el formulario hijo se muestre a pantalla completa o minimizado dentro del formulario principal, pero para que eso funcione en VB2005, el valor de WindowState del formulario hijo (en este ejemplo el Form2) debe estar asignado a Normal, ya que si está de otra forma, la primera vez que se muestre lo hará en modo normal, pero con los iconos de la parte superior derecha como si estuviera maximizado (ver figura 3), y aunque si pulsamos en la barra de título para ponerlo normal y después para maximizarlo, funcionará bien, (también se "ajustará" al cambiar el tamaño del form principal), el efecto no es muy "profesional" que digamos, así que... apúntate este "truco" por si te ocurre.

Figura 3. Si el form hijo, en modo diseño, tiene un valor en WindowState distinto de Normal se verá "raro"
Figura 3. Si el form hijo, en modo diseño,tiene un valor en WindowState distinto de Normal se verá "raro"

Ese "extraño efecto" ocurre tengamos o no la línea que asigna el valor de WindowState en el código mostrado anteriormente (el que usaremos para mostrar el formulario hijo).
El aspecto que debería tener es el que vemos en la figura 4, ya que al estar maximizado, no deberíamos ver la barra de título, que solo debe mostrarse al estar en modo Normal o cuando está minimizado.
Figura 4. El aspecto correcto cuando el form hijo está maximizado
Figura 4. El aspecto correcto cuando el form hijo está maximizado

Cuando un GoupBox está dentro de otro GroupBox, en VS 2005 se ve bien, pero no en VS 2003

Una nota final, como puedes ver en las figuras anteriores, el form hijo no tiene una caja de textos, (que es lo que debería tener para que funcione el código del ejemplo de Visual Studio 2003), es que he estado probando si en VB2005 ocurre lo mismo que en VB2003 cuando un GroupBox está dentro de otro GroupBox. En el caso de VS 2003 (en VB y C# ocurre lo mismo), el segundo GroupBox se ve mal, con el texto más grande de lo normal, (ver figura 5), para solucionarlo hay que incluir el segundo GroupBox dentro de un control de tipo Panel y de esa forma el aspecto será como el de la figura 4, que es el correcto.
Figura 5. Los GroupBoxs anidados en VS2003 se ven mal al usar los extilos de XP
Figura 5. Los GroupBoxs anidados en VS2003 se ven mal al usar los estilos de XP

Pues esto es todo... salvo por aclarar que todo lo dicho es válido tanto para Visual Basic 2005 como para Visual C# 2005 (y tanto para las versiones Express como las normales de Visual Studio 2005).