Cómo crear un control de usuario (Windows Forms .NET)
En este artículo, se explica cómo agregar un control de usuario al proyecto y, después, agregar ese control de usuario a un elemento form. Creará un control de usuario reutilizable que sea visualmente atractivo y funcional. El nuevo control agrupa un control TextBox con un control Button. Cuando el usuario selecciona el elemento button, se borra el texto del cuadro de texto. Para obtener más información sobre los controles de usuario, consulte Información general sobre el control de usuario.
Adición de un control de usuario al proyecto
Después de abrir el proyecto de Windows Forms en Visual Studio, use las plantillas de Visual Studio para crear un control de usuario:
En Visual Studio, busque la ventana Explorador de proyectos. Haga clic con el botón derecho en el proyecto y seleccione Agregar>Control de usuario (Windows Forms).
Establezca el elemento Name del control en ClearableTextBox y pulse Agregar.
Una vez creado el control de usuario, Visual Studio abre el diseñador:
Diseño del cuadro de texto que se puede borrar
El control de usuario se compone de controles constituyentes, que son los controles que crea en la superficie de diseño, igual que cuando diseña un elemento form. Siga estos pasos para agregar y configurar el control de usuario y sus controles constituyentes:
Con el diseñador abierto, la superficie de diseño del control de usuario debe ser el objeto seleccionado. Si no es así, haga clic en la superficie de diseño para seleccionarla. Establezca las siguientes propiedades en la ventana Propiedades:
Propiedad Valor MinimumSize 84, 53
Size 191, 53
Agregue un control Label. Establezca las siguientes propiedades:
Property Valor Nombre lblTitle
Ubicación 3, 5
Agregue un control TextBox. Establezca las siguientes propiedades:
Property Valor Nombre txtValue
Delimitador Top, Left, Right
Ubicación 3, 23
Tamaño 148, 23
Agregue un control Button. Establezca las siguientes propiedades:
Property Valor Nombre btnClear
Delimitador Top, Right
Ubicación 157, 23
Tamaño 31, 23
Texto ↻
El control debe tener un aspecto similar al de la siguiente imagen:
Presione F7 para abrir el editor de código de la clase
ClearableTextBox
.Realice los siguientes cambios en el código:
En la parte superior del archivo de código, importe el espacio de nombres
System.ComponentModel
.Agregue el atributo
DefaultEvent
a la clase. Este atributo establece el evento generado por el consumidor cuando se hace doble clic en el control en el diseñador. El consumidor es el objeto que declara y usa este control. Para obtener más información sobre los atributos, consulte Atributos (C#) o Información general sobre los atributos (Visual Basic).using System.ComponentModel; namespace UserControlProject { [DefaultEvent(nameof(TextChanged))] public partial class ClearableTextBox : UserControl
Imports System.ComponentModel <DefaultEvent("TextChanged")> Public Class ClearableTextBox
Agregue un controlador de eventos que reenvíe el evento
TextBox.TextChanged
al consumidor:[Browsable(true)] public new event EventHandler? TextChanged { add => txtValue.TextChanged += value; remove => txtValue.TextChanged -= value; }
<Browsable(True)> Public Shadows Custom Event TextChanged As EventHandler AddHandler(value As EventHandler) AddHandler txtValue.TextChanged, value End AddHandler RemoveHandler(value As EventHandler) RemoveHandler txtValue.TextChanged, value End RemoveHandler RaiseEvent(sender As Object, e As EventArgs) End RaiseEvent End Event
Observe que el evento incluye el atributo
Browsable
declarado. Cuando el atributoBrowsable
se aplica a un evento o propiedad, controla si el elemento está visible o no en la ventana Propiedades cuando se selecciona el control en el diseñador. En este caso,true
se pasa como un parámetro al atributo para indicar que el evento debe estar visible.Agregue una propiedad de cadena denominada
Text
, la cual reenvía la propiedadTextBox.Text
al consumidor:[Browsable(true)] public new string Text { get => txtValue.Text; set => txtValue.Text = value; }
<Browsable(True)> Public Shadows Property Text() As String Get Return txtValue.Text End Get Set(value As String) txtValue.Text = value End Set End Property
Agregue una propiedad de cadena denominada
Title
, la cual reenvía la propiedadLabel.Text
al consumidor:[Browsable(true)] public string Title { get => lblTitle.Text; set => lblTitle.Text = value; }
<Browsable(True)> Public Property Title() As String Get Return lblTitle.Text End Get Set(value As String) lblTitle.Text = value End Set End Property
Vuelva al diseñador de
ClearableTextBox
y haga doble clic en el controlbtnClear
para generar un controlador para el eventoClick
. Agregue el código siguiente para el controlador, que borra el cuadro de textotxtValue
:private void btnClear_Click(object sender, EventArgs e) => Text = "";
Private Sub btnClear_Click(sender As Object, e As EventArgs) txtValue.Text = "" End Sub
Por último, compile el proyecto haciendo clic en él con el botón derecho desde la ventana Explorador de soluciones y seleccionando Compilar. No debería haber errores y, una vez finalizada la compilación, el control
ClearableTextBox
debería aparecer en el cuadro de herramientas para su uso.
El siguiente paso consiste en usar el control en un elemento form.
Aplicación de ejemplo
Si ha creado un nuevo proyecto en la última sección, tiene un elemento Form en blanco llamado Form1; de lo contrario, cree un nuevo elemento form.
En la ventana Explorador de soluciones, haga doble clic en el elemento form para abrir el diseñador. Se debe seleccionar la superficie de diseño del elemento form.
Establezca la propiedad
Size
del elemento form en432, 315
.Abra la ventana Cuadro de herramientas y haga doble clic en el control ClearableTextBox. Este control debería aparecer en una sección denominada igual que el proyecto.
De nuevo, haga doble clic en el control ClearableTextBox para generar un segundo control.
Vuelva al diseñador y separe los controles para que pueda ver ambos.
Seleccione un control y establezca las siguientes propiedades:
Propiedad Valor Nombre ctlFirstName
Ubicación 12, 12
Tamaño 191, 53
Título First Name
Seleccione el otro control y establezca las siguientes propiedades:
Propiedad Valor Nombre ctlLastName
Ubicación 12, 71
Tamaño 191, 53
Título Last Name
De nuevo en la ventana Cuadro de herramientas, agregue un control label al elemento form y establezca las siguientes propiedades:
Propiedad Valor Nombre lblFullName
Ubicación 12, 252
Después, debe generar los controladores de eventos para los dos controles de usuario. En el diseñador, haga doble clic en el control
ctlFirstName
. Esta acción genera el controlador de eventos para el eventoTextChanged
y abre el editor de código.Vuelva al diseñador y haga doble clic en el control
ctlLastName
para generar el segundo controlador de eventos.Vuelva al diseñador y haga doble clic en la barra de título del elemento form. Esta acción genera un controlador de eventos para el evento
Load
.En el editor de código, agregue un método denominado
UpdateNameLabel
. Este método combina ambos nombres para crear un mensaje y asigna el mensaje al controllblFullName
.private void UpdateNameLabel() { if (string.IsNullOrWhiteSpace(ctlFirstName.Text) || string.IsNullOrWhiteSpace(ctlLastName.Text)) lblFullName.Text = "Please fill out both the first name and the last name."; else lblFullName.Text = $"Hello {ctlFirstName.Text} {ctlLastName.Text}, I hope you're having a good day."; }
Private Sub UpdateNameLabel() If String.IsNullOrWhiteSpace(ctlFirstName.Text) Or String.IsNullOrWhiteSpace(ctlLastName.Text) Then lblFullName.Text = "Please fill out both the first name and the last name." Else lblFullName.Text = $"Hello {ctlFirstName.Text} {ctlLastName.Text}, I hope you're having a good day." End If End Sub
Para ambos controladores de eventos
TextChanged
, llame al métodoUpdateNameLabel
:private void ctlFirstName_TextChanged(object sender, EventArgs e) => UpdateNameLabel(); private void ctlLastName_TextChanged(object sender, EventArgs e) => UpdateNameLabel();
Private Sub ctlFirstName_TextChanged(sender As Object, e As EventArgs) Handles ctlFirstName.TextChanged UpdateNameLabel() End Sub Private Sub ctlLastName_TextChanged(sender As Object, e As EventArgs) Handles ctlLastName.TextChanged UpdateNameLabel() End Sub
Por último, llame al método
UpdateNameLabel
desde el eventoLoad
del elemento form:private void Form1_Load(object sender, EventArgs e) => UpdateNameLabel();
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load UpdateNameLabel() End Sub
Ejecute el proyecto y escriba un nombre y un apellido:
Pruebe a pulsar el elemento ↻
button para restablecer uno de los cuadros de texto.
.NET Desktop feedback