Para este pequeño tutorial estaremos considerando Visual Studio 2005, usando VB.
¿Qué es un UserControl y para qué sirve?
Un User Control no es más que una clase común .vb que también provee las referencias para poder trabajar con las clases dentro del espacio de nombres System.Windows.Forms, a diferencia de los Class Library, que es buen tema para otro post. Con los User Control podemos crear controles más complejos o avanzados derivados de los controles que ya nos proporciona el IDE, tal como veremos más adelante con un ejemplo. Aquí les muestro paso a paso cómo crearlos y usarlos. En el siguiente ejemplo haremos una pequeñísima parte de lo que tuve que hacer para la aplicación que estaba desarrollando, esto es poder generar en tiempo de ejecución nuevas instanacias de los controles que vamos a diseñar y programar.
¿Cómo se hace?




4. Podremos ver un nuevo lienzo que no contiene barras de título ni bordes, en el cual comenzaremos a diseñar nuestro control.

6. Habiendo temrinado con el diseño de ControlRegistro, crearemos




9. Finalmente tendremos el siguiente aspecto en nuestro formulario principal Form1.

Pues bien, ya hemos diseñado nuestros controles, solo falta darles vida, para esto pondremos fragmentos de código en ControlRegistro, ControlAsiento y Form1.
*** Form1 ***
Public Class Form1
Dim asiento As ControlAsiento
Sub crearAsiento(ByVal asientoAnterior As ControlAsiento)
' Calculamos la posición del nuevo asiento a partir del asiento anterior, el cual hizo la llamada
' y agregamos el nuevo ControlAsiento al formulario
asiento = New ControlAsiento
asiento.Location = New Point(asientoAnterior.Location.X, asientoAnterior.Location.X + asientoAnterior.Height + 5)
asiento.Label1.Text = asientoAnterior.Label1.Text + 1
With GroupBox1
.Size = New Size(.Width, .Height + asientoAnterior.Height + 5)
.Controls.Add(asiento)
End With
End Sub
End Class
*** ControlAsiento ***
Public Class ControlAsiento
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
' Llamamos al método crearAsiento() del formulario que contiene a este asiento.
CType(Me.FindForm, Form1).crearAsiento(Me)
End Sub
Private Sub ControlAsiento_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' Es solo un ejemplo de cómo se puede agregar un manejador de eventos a un control,
' ya que en micaso he usado mucho este tipo de manejadores al momento de crear controles dinámicamente
' y tener varias formas de acceder a un mismo evento
AddHandler Button1.Click, AddressOf Button1_Click
End Sub
Sub crearRegistro(ByVal sender As ControlRegistro)
Dim reg As New ControlRegistro
' La separación que agregaremos a la posición del registro y demás controles, y la cantidad que agregaremos al tamaño del GroupBox1
Dim y = sender.Height + 3
reg.Location = New Point(sender.Location.X, sender.Location.Y + y)
' Bajamos también la caja de texto multilinea y los botones del ControlAsiento
redaccion.Location = New Point(redaccion.Location.X, redaccion.Location.Y + y)
Button1.Location = New Point(Button1.Location.X, Button1.Location.Y + y)
Button2.Location = New Point(Button2.Location.X, Button2.Location.Y + y)
' Con Me.ParentForm obtenemos el formuylario que contiene a este control y lo convertimos al tipo Form1, que es la clase que tenemos
With CType(Me.ParentForm, Form1).GroupBox1
.Size = New Size(.Width, .Height + y)
End With
' Agregamos el nuevo control al contenedor correspondiente, en este caso ControlAsiento que contiene al botón que hemos presionado
Me.Controls.Add(reg)
End Sub
End Class
*** ControlRegistro ***
Public Class ControlRegistroHe resaltado en negritas algunas funciones que son de mucha utilidad para poder acceder a los controles que contienen a nuestros User Control, y así poder usar propiedades y métodos de estos.
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
' Obtenemos el ControlAsiento que contiene a este ControlRegistro
Dim asiento As ControlAsiento = Me.Parent
' Llamamos a la subrutina que hicimos en ControlAsiento para generar nuevos registros
asiento.crearRegistro(Me)
End Sub
End Class
Lo que el código anterior hará será generar un nuevo asiento debajo del asiento que contiene al botón '+' en donde se hizo clic. Y generará un nuevo registro debajo del registro en el que se encuentra el botón '+' en el que se hizo clic.

Como hemos visto, podemos usar User Control no solo para aquellos casos en los que tendremos que usar un control complejo en varias partes de nuestra aplicación, sino también en casos en los que sea necesario crear dinámicamente algunos controles complejos sin necesidad de rompernos tanto la cabeza, como a mí me pasó.
Espero que les sirva de algo este breve tutorial.
Gracias, es exactamente lo que buscaba. Ejemplo claro y concreto. Felicidades. Ayudanos!!! sigue publicando articulos. Gracias.
ResponderEliminar@Jose, muchas gracias por tu comentario; aunque tenga poco tiempo entre la escuela y el trabajo, me anima a seguir publicando. Qué bueno que te haya sido de ayuda.
ResponderEliminarTengo una consulta:
ResponderEliminarquiero hacer una especie de barra con un panel y tres botones, la idea es sobreescribir el evento click de cada uno de los botones en el formulario que contenga el control.
Lo he probado pero nunca me levanta el evento que puse en el form cotenedor sino que solo me levanta el evento click dentro del mismo control.
Como puedo hacer para sobreescribir los eventos click de los botones?
Saludos y gracias.
Te recomiendo que te inscribas y crees un nuevo tema en este foro donde podremos conversar mejor sobre este tema. Y espero que comentes mejor tu duda y copies tu código para poder entender lo que haces y así poder ayudarte pronto...
ResponderEliminarhttp://fit.um.edu.mx/foros/index.php?board=5.0
Entre otras cosas, creo necesitas explicar más detenidamente lo que necesitas y qué has hecho...
ResponderEliminarTal vez esto te sirva... es para hacer overriding a eventos...
http://msdn.microsoft.com/en-us/library/aa290043(VS.71).aspx
hola jesfre, gracias por constestar.
ResponderEliminarMira la idea es hacer un control con 3 botones, una especie de toolbar generica, que me sirva para varias paginas de un mismo sitio, es decir en lugar de estar copiando y pegando el panel y los tres botones, solo agregaria el control y programaria los eventos de los botones para cada pagina.
Pondria el codigo pero no me lo acepta el blogger, pero solo es un asp:panel con tres asp:linbutton.
Saludos, espero que me hayas entendido. Adrián.
me puede decir como cambiarle el icono a los User controls??
ResponderEliminargracias de antemano
@Bunbury Lo que quieres hacer lo puedes encontrar en este sitio de M$:
ResponderEliminarhttp://support.microsoft.com/kb/311315/es
Tbmn lo encontré explicado de forma sencilla en este hilo:
http://www.eggheadcafe.com/software/aspnet/34242179/como-asociar-un-icono-a-un-usercontrol.aspx
Buen día.