Cómo vincular controles a una fuente de datos de objeto en un proyecto de aplicación WinForms (.NET Core)

 C Programming >> Programación C >  >> Tags >> .NET
Cómo vincular controles a una fuente de datos de objeto en un proyecto de aplicación WinForms (.NET Core)

La asignación manual de clases a los controles de la interfaz de usuario es probablemente lo más tedioso que puede hacer en la codificación. Para minimizar este esfuerzo de codificación, puede vincular sus controles a una fuente de datos de objetos. En este artículo, mostraré cómo hacer esto en un proyecto de aplicación WinForms (.NET Core). Primero, mostraré paso a paso cómo configurar el enlace a través de la interfaz de usuario (tanto en VS2019 como en VS2022). Luego mostraré cómo configurar el enlace mediante programación (incluido un ejemplo de enlace automático basado en una convención de nomenclatura).

1 – Agregar una clase

Agregue una clase con propiedades públicas que desee vincular a los controles de formulario. Para mantener esto simple, agregaremos una clase con una sola propiedad de cadena que queremos vincular a un cuadro de texto.

public class Coder
{
	public string Name { get; set; }
}
Code language: C# (cs)

2 – Agregar un origen de enlace

Agregue un control BindingSource al formulario y configure su clase como su fuente de datos de objeto. Esto le permite vincular controles a las propiedades de su clase en tiempo de diseño. Los pasos para agregar un BindingSource como este son diferentes para VS2019 y VS2022, así que consulte la sección correspondiente a continuación.

En VS2022

Para agregar un BindingSource con una fuente de datos de objetos en VS2022:

  • Agregue un control BindingSource al formulario.
  • En las propiedades de BindingSource, haga clic en DataSource y Añadir nueva fuente de datos de objeto
  • Seleccione su clase de la lista y haga clic en Aceptar.

Nota:Si no ve su clase pública, reconstruya el proyecto y vuelva a intentar este paso.

  • En las propiedades de BindingSource, haga clic en DataSource y seleccione su clase (Otras fuentes de datos> Fuentes de datos del proyecto> Codificador ).

En VS2019

Para agregar un BindingSource con una fuente de datos de objeto en VS2019:

  • Agregue un archivo al proyecto llamado Coder.datasource con el siguiente XML (con su propia información de tipo de clase):
<?xml version="1.0" encoding="utf-8"?>

<GenericObjectDataSource DisplayName="Coder" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
  <TypeInfo>WinFormsProject.Coder, WinFormsProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null</TypeInfo>
</GenericObjectDataSource>
Code language: HTML, XML (xml)

Nota:Esto es necesario porque VS2019 no tiene el asistente "Agregar nueva fuente de datos de objetos".

  • Agregue un control BindingSource al formulario.
  • En las propiedades de BindingSource, haga clic en DataSource y seleccione su clase (Otras fuentes de datos> Fuentes de datos del proyecto> Codificador ).

Si no acepta su clic, verifique dos veces la información del tipo de clase en Coder.datasource archivar y reconstruir.

3 – Vincular un control a una propiedad a través de BindingSource

  • Agregue un control TextBox al formulario.
  • En las propiedades del cuadro de texto, haga clic en Enlaces de datos> Avanzado> haga clic en el botón […].
  • Seleccione las propiedades para enlazar y haga clic en Aceptar. En este ejemplo, vinculamos coderBindingSource.Name con TextBox.Text propiedad.

4:en el código, establezca BindingSource.DataSource en un objeto

Ahora que la configuración del enlace está lista, puede hacer el enlace configurando BindingSource.DataSource en una instancia de objeto en el código, así:

public frmCoder()
{
	InitializeComponent();

	var coder = new Coder() { Name = "Bob" };
	coderBindingSource.DataSource = coder;
}
Code language: C# (cs)

Esto se une al objeto Coder cuando el formulario se inicializa y muestra Coder.Name en el cuadro de texto enlazado:

Puede obtener los datos iniciales del objeto desde cualquier lugar:una base de datos, una API, un archivo de configuración o incluso codificarlo. Solo asegúrese de configurar BindingSource.DataSource cuando tenga una nueva instancia.

Configurar los enlaces mediante programación

Todos los pasos anteriores mostraron cómo configurar los enlaces en el momento del diseño para minimizar el esfuerzo de codificación. Si lo prefiere, puede agregar enlaces mediante programación llamando a IBindableComponent.DataBindings.Add() para cada control que desee enlazar, así:

public frmCoder()
{
	InitializeComponent();

	var coder = new Coder() { Name = "Bob" };
	txtCoder.DataBindings.Add(nameof(TextBox.Text), coder, nameof(Coder.Name));
        //This means bind coder.Name -> txtCoder.Text
}
Code language: C# (cs)

Nota:Tenga cuidado con agregar el mismo enlace dos veces. Esto provocará una excepción de tiempo de ejecución. Si ya ha agregado enlaces a través de la interfaz de usuario, asegúrese de eliminarlos si está utilizando este enfoque programático.

Cuando se inicia el formulario, el cuadro de texto muestra "Bob" (de Coder.Name).

Enlace automático programáticamente

Si desea vincular automáticamente los controles a las propiedades de su clase, puede recorrer los controles del formulario y llamar a DataBindings.Add() para cada control. Aquí hay un ejemplo de controles de vinculación automática (solo cuadros de texto para abreviar) usando una convención de nomenclatura simple:

var coder = new Coder() { FullName = "Bob" };

//Auto-bind by naming convention (coder.Property.Name == control.Name)

var coderPropNames = coder.GetType().GetProperties().Select(t => t.Name).ToHashSet();
foreach (Control control in this.Controls)
{

	if (!coderPropNames.Contains(control.Name))
		continue;

	switch (control)
	{
		case TextBox txt:
			txt.DataBindings.Add(nameof(txt.Text), coder, txt.Name);
			break;
		//add other control types here
	}
}
Code language: C# (cs)

Nota:al usar esta convención de nomenclatura demasiado simple, es muy probable que se encuentre con una colisión de nomenclatura en algún momento, lo que resulta en un error de tiempo de compilación bastante confuso (por ejemplo:"No se puede convertir de cadena a control"). Los nombres de control no pueden ser los mismos que los nombres de propiedad de formulario existentes (es decir, no se puede usar "Nombre" porque form.Name existe) .

Por supuesto, el riesgo aquí es que los nombres de control y los nombres de propiedades de clase podrían perder la sincronización. Si opta por este enfoque, considere tratar de detectar estos escenarios con anticipación, para que no tenga que dedicar tiempo a la depuración en el futuro.