Introducción al enlace de datos (Windows Forms para .NET)

Windows Forms permite enlazar no solo a orígenes de datos tradicionales, sino también a prácticamente cualquier estructura que contenga datos. Se puede enlazar a una matriz de valores que se calcula en tiempo de ejecución, se lee de un archivo o se deriva de los valores de otros controles.

Además, se puede enlazar cualquier propiedad de cualquier control al origen de datos. En el enlace de datos tradicional, habitualmente se enlaza la propiedad de presentación —por ejemplo, la propiedad Text de un control TextBox— al origen de datos. Con .NET, también existe la opción de establecer otras propiedades mediante enlaces. Puede usar el enlace para cualquiera de las siguientes tareas:

  • Establecer el gráfico de un control de imagen.

  • Establecer el color de fondo de uno o más controles.

  • Establecer el tamaño de los controles.

Esencialmente, el enlace de datos es un modo automático de establecer cualquier propiedad accesible en tiempo de ejecución de cualquier control en un formulario.

ADO.NET le permite crear varias estructuras de datos distintas para satisfacer las necesidades de enlace de la aplicación y los datos con los que trabaja. Es posible que quiera crear sus propias clases que proporcionen o consuman datos en Windows Forms. Estos objetos pueden ofrecer distintos niveles de funcionalidad y complejidad. Desde el enlace de datos básico hasta proporcionar compatibilidad en tiempo de diseño, comprobación de errores, notificación de cambios o incluso compatibilidad con la reversión estructurada de los cambios hechos en los propios datos.

Consumidores de interfaces de enlace de datos

En las secciones siguientes se describen dos grupos de objetos de interfaz. El primer grupo de interfaz lo implementan los autores de los orígenes de datos en los orígenes de datos. Los consumidores del origen de datos, como los componentes o los controles de Windows Forms implementan estas interfaces. El segundo grupo de interfaz está diseñado para que lo usen los autores de los componentes. Los autores de componentes usan estas interfaces cuando crean un componente que admite que el motor de enlace de datos de Windows Forms use el enlace de datos. Puede implementar estas interfaces dentro de las clases asociadas al formulario para habilitar el enlace de datos. Cada caso presenta una clase que implementa una interfaz que permite la interacción con los datos. Las herramientas de experiencia de diseño de datos de desarrollo rápido de aplicaciones (RAD) de Visual Studio ya sacan partido de esta funcionalidad.

Interfaces para la implementación por parte de los autores del origen de datos

Los controles de Windows Forms implementan las siguientes interfaces:

  • IList (interfaz)

    Una clase que implementa la interfaz IList podría ser un objeto Array, ArrayList o CollectionBase. Se trata de listas indexadas de elementos de tipo Object, y las listas deben contener tipos homogéneos, ya que el primer elemento del índice determina el tipo. IList solamente estaría disponible para la operación de enlace en tiempo de ejecución.

    Nota:

    Si desea crear una lista de objetos de negocios para operaciones de enlace con Windows Forms, considere la posibilidad de usar BindingList<T>. BindingList es una clase extensible que implementa las interfaces principales que se requieren para el enlace de datos bidireccional de Windows Forms.

  • IBindingList (interfaz)

    Una clase que implemente la interfaz IBindingList proporciona un nivel mucho mayor de funcionalidad de enlace de datos. Esta implementación ofrece funcionalidades básicas de ordenación y notificación de cambios. Ambas son útiles cuando cambian los elementos de lista y cuando cambia la propia lista. La notificación de cambios es importante si planea tener varios controles enlazados a los mismos datos. Le ayuda a hacer cambios en los datos realizados en uno de los controles para propagarse a los otros controles enlazados.

    Nota:

    La notificación de cambios se habilita para la interfaz IBindingList a través de la propiedad SupportsChangeNotification que, cuando es true, genera un evento ListChanged, lo que indica que la lista (o un elemento de la lista) ha cambiado.

    El tipo de cambio se describe mediante la propiedad ListChangedType del parámetro ListChangedEventArgs. Por lo tanto, siempre que se actualiza el modelo de datos, también se actualizará toda vista dependiente, como otros controles enlazados al mismo origen de datos. Sin embargo, los objetos contenidos en la lista deberán notificar a la lista cuando cambien para que esta pueda generar el evento ListChanged.

    Nota:

    BindingList<T> proporciona una implementación genérica de la interfaz IBindingList.

  • IBindingListView (interfaz)

    Una clase que implementa la interfaz IBindingListView proporciona toda la funcionalidad de una implementación de IBindingList, junto con funcionalidades avanzadas de filtrado y ordenación. Esta implementación ofrece filtrado basado en cadena y ordenación en varias columnas con pares de descriptor de propiedad y dirección.

  • IEditableObject (interfaz)

    Una clase que implementa la interfaz IEditableObject permite que un objeto controle cuándo se hacen permanentes los cambios realizados en ese objeto. Esta implementación admite los métodos BeginEdit, EndEdit y CancelEdit, que permiten revertir los cambios realizados en el objeto. A continuación se describe brevemente el funcionamiento de los métodos BeginEdit, EndEdit y CancelEdit, y cómo funcionan entre sí para permitir la reversión de los cambios realizados en los datos:

    • El método BeginEdit señala el inicio de la edición de un objeto. Un objeto que implementa esta interfaz necesitará almacenar cualquier actualización que se realice después de llamar al método BeginEdit, de modo que las actualizaciones puedan descartarse si se llama al método CancelEdit. En los enlaces de datos de Windows Forms, puede llamar varias veces a BeginEdit dentro del ámbito de una sola transacción de edición (por ejemplo, BeginEdit, BeginEdit, EndEdit). Las implementaciones de IEditableObject deben llevar un seguimiento de si ya se ha llamado a BeginEdit y omitir las llamadas subsiguientes a BeginEdit. Puesto que se puede llamar varias veces a este método, es importante que las llamadas posteriores a este método no sean destructivas. Las llamadas posteriores a BeginEdit no pueden destruir las actualizaciones realizadas ni cambiar los datos guardados en la primera llamada a BeginEdit.

    • El método EndEdit inserta cualquier cambio hecho desde que se llamó a BeginEdit en el objeto subyacente, si el objeto está actualmente en el modo de edición.

    • El método CancelEdit descarta todos los cambios realizados en el objeto.

    Para obtener más información sobre cómo funcionan los métodos BeginEdit, EndEdit y CancelEdit, vea Guardar los datos de nuevo en la base de datos.

    Esta noción transaccional de la funcionalidad de los datos la usa el control DataGridView.

  • ICancelAddNew (interfaz)

    Una clase que implementa la interfaz ICancelAddNew suele implementar la interfaz IBindingList y permite revertir cualquier adición hecha en el origen de datos con el método AddNew. Si el origen de datos implementa la interfaz IBindingList, también debería hacer que implemente la interfaz ICancelAddNew.

  • IDataErrorInfo (interfaz)

    Una clase que implementa la interfaz IDataErrorInfo permite que los objetos ofrezcan información personalizada sobre errores a los controles enlazados:

    • La propiedad Error devuelve un texto de mensaje de error general (por ejemplo, "Se produjo un error").

    • La propiedad Item[] devuelve una cadena con el mensaje de error específico de la columna (por ejemplo, "El valor de la columna State no es válido").

  • IEnumerable (interfaz)

    ASP.NET suele usar una clase que implementa la interfaz IEnumerable. La compatibilidad de Windows Forms con esta interfaz solo está disponible a través del componente BindingSource.

    Nota:

    El componente BindingSource copia todos los elementos IEnumerable en una lista independiente con fines de enlace.

  • ITypedList (interfaz)

    Una clase de colección que implementa la interfaz ITypedList ofrece la característica para controlar el orden y el conjunto de propiedades expuestas al control enlazado.

    Nota:

    Cuando se implementa el método GetItemProperties y la matriz PropertyDescriptor no es nula, la última entrada de la matriz será el descriptor de propiedad que describe la propiedad de lista, que es otra lista de elementos.

  • ICustomTypeDescriptor (interfaz)

    Una clase que implementa la interfaz ICustomTypeDescriptor proporciona información dinámica sobre sí misma. Esta interfaz es similar a ITypedList, pero se usa con objetos en lugar de con listas. DataRowView usa esta interfaz para proyectar el esquema de las filas subyacentes. La clase CustomTypeDescriptorproporciona una implementación sencilla de ICustomTypeDescriptor.

    Nota:

    Para admitir el enlace en tiempo de diseño a tipos que implementan ICustomTypeDescriptor, el tipo también debe implementar IComponent y existir como una instancia en el formulario.

  • IListSource (interfaz)

    Una clase que implementa la interfaz IListSource habilita el enlace basado en lista en objetos que no están en una lista. El método GetList de IListSource se usa para devolver una lista enlazable desde un objeto que no se hereda de IList.La clase DataSet utiliza IListSource.

  • IRaiseItemChangedEvents (interfaz)

    Una clase que implementa la interfaz IRaiseItemChangedEvents es una lista enlazable que también implementa la interfaz IBindingList. Esta interfaz se usa para indicar si el tipo genera eventos ListChanged de tipo ItemChanged mediante su propiedad RaisesItemChangedEvents.

    Nota:

    IRaiseItemChangedEvents debe implementarse si el origen de datos proporciona la conversión de propiedad a evento de lista descrita anteriormente e interactúa con el componente BindingSource. De lo contrario, BindingSource también realizará la conversión de propiedad a evento de lista, lo que ralentizará el rendimiento.

  • ISupportInitialize (interfaz)

    Un componente que implementa la interfaz ISupportInitialize se beneficia de las ventajas de las optimizaciones por lotes para establecer las propiedades e inicializar las propiedades codependientes. ISupportInitialize contiene dos métodos:

    • BeginInit indica que la inicialización de objetos está empezando.

    • EndInit indica que la inicialización de objetos está finalizando.

  • ISupportInitializeNotification (interfaz)

    Un componente que implementa la interfaz ISupportInitializeNotification también implementa la interfaz ISupportInitialize. Esta interfaz permite notificar a otros componentes ISupportInitialize que la inicialización está completa. La interfaz ISupportInitializeNotification contiene dos miembros:

  • INotifyPropertyChanged (interfaz)

    Una clase que implementa esta interfaz es un tipo que genera un evento cuando cambia cualquiera de sus valores de propiedad. Esta interfaz está diseñada para reemplazar el patrón de tener un evento de cambio para cada propiedad de un control. Cuando se usa en una clase BindingList<T>, un objeto de negocios debería implementar la interfaz INotifyPropertyChanged y BindingList1 convertirá los eventos PropertyChanged en eventos ListChanged de tipo ItemChanged.

    Nota:

    Para que se produzca la notificación de cambios en un enlace entre un cliente enlazado y un origen de datos, el tipo de origen de datos enlazado debería implementar la interfaz INotifyPropertyChanged (opción recomendada), o el usuario podría proporcionar eventos propertyNameChanged para el tipo enlazado, pero no ambos.

Interfaces para la implementación por parte de los autores de componentes

Las interfaces siguientes están diseñadas para que las use el motor de enlace de datos de Windows Forms:

Orígenes de datos compatibles con Windows Forms

El enlace de datos se ha usado tradicionalmente en las aplicaciones para aprovechar los datos almacenados en las bases de datos. Con el enlace de datos de Windows Forms, puede acceder a los datos de las bases de datos y a los datos de otras estructuras (como matrices y colecciones), siempre y cuando se cumplan ciertos requisitos mínimos.

Estructuras a las que se puede enlazar

En Windows Forms se puede enlazar a una amplia variedad de estructuras, desde objetos simples (enlace simple) a listas complejas, como las tablas de datos ADO.NET (enlace complejo). En un enlace simple, Windows Forms admite el enlace a las propiedades públicas en el objeto simple. El enlace basado en listas de Windows Forms suele requerir que el objeto admita las interfaces IList o IListSource. Además, si va a enlazar a través de un componente BindingSource, puede enlazar a un objeto que admita la interfaz IEnumerable.

En la lista siguiente se muestran las estructuras a las que se puede enlazar en Windows Forms.

  • BindingSource

    BindingSource es el origen de datos de Windows Forms más común, y actúa como proxy entre un origen de datos y los controles de Windows Forms. El patrón de uso general de BindingSource consiste en enlazar los controles a BindingSource y enlazar BindingSource al origen de datos (por ejemplo, una tabla de datos ADO.NET o un objeto de negocios). BindingSource proporciona servicios que habilitan y mejoran el nivel de compatibilidad con el enlace de datos. Por ejemplo, los controles de Windows Forms basados en listas como DataGridView y ComboBox no admiten directamente el enlace a orígenes de datos IEnumerable, pero este escenario puede ser factible si se enlazan a través de BindingSource. En tal caso, BindingSource convertirá el origen de datos en IList.

  • Objetos simples

    Windows Forms admite el enlace de datos de propiedades de control a propiedades públicas en la instancia de un objeto mediante el tipo Binding. Windows Forms también admite el enlace de controles basados en listas, como, por ejemplo, un objeto ListControl, a una instancia de objeto si se usa BindingSource.

  • Matrices o colecciones

    Para actuar como origen de datos, una lista debe implementar la interfaz IList; un ejemplo de esto sería una matriz que sea una instancia de la clase Array. Para obtener más información sobre las matrices, vea Procedimiento para crear una matriz de objetos (Visual Basic).

    En general, debe usar BindingList<T> al crear listas de objetos para el enlace de datos. BindingList es una versión genérica de la interfaz IBindingList. La interfaz IBindingList amplía la interfaz IList al agregar las propiedades, métodos y eventos necesarios para el enlace de datos bidireccional.

  • IEnumerable

    Los controles de Windows Forms se pueden enlazar a orígenes de datos que solo admiten la interfaz IEnumerable si se enlazan a través de un componente BindingSource.

  • Objetos de datos ADO.NET

    ADO.NET proporciona muchas estructuras de datos adecuadas a las que enlazar. Cada una difiere en cuanto a elaboración y complejidad.

    • DataColumn

      DataColumn es el bloque de creación esencial de un objeto DataTable donde muchas columnas componen una tabla. Cada DataColumn tiene una propiedad DataType que determina el tipo de datos que la columna contiene (por ejemplo, la marca de un automóvil en una tabla de automóviles). Puede enlazar un control mediante enlace simple (como la propiedad Text de un control TextBox) a una columna dentro de una tabla de datos.

    • DataTable

      DataTable es la representación de una tabla, con filas y columnas, en ADO.NET. Una tabla de datos contiene dos colecciones: DataColumn, que representa las columnas de datos de una tabla (que, en última instancia, determinan los tipos de datos que se pueden introducir en esa tabla), y DataRow, que representa las filas de datos de una tabla. Puede enlazar un control mediante enlace complejo a la información contenida en una tabla de datos (por ejemplo, enlazar el control DataGridView a una tabla de datos). Sin embargo, cuando se enlaza a DataTable, se está enlazado a la vista predeterminada de la tabla.

    • DataView

      DataView es una vista personalizada de una sola tabla de datos que se puede filtrar u ordenar. Una vista de datos es la "instantánea" de datos que utilizan los controles enlazados mediante enlace complejo. Dentro de una vista de datos se puede enlazar a datos mediante enlace simple o enlace complejo, pero tenga en cuenta que estará enlazando a una "imagen" fija de los datos, y no a un origen de datos limpio y actualizado.

    • DataSet

      DataSet es una colección de tablas, relaciones y restricciones de los datos de una base de datos. Se puede enlazar a los datos de un conjunto de datos mediante un enlace simple o complejo, pero tenga en cuenta que estará enlazando al elemento DataViewManager predeterminado de DataSet (vea el siguiente punto).

    • DataViewManager

      DataViewManager es una vista personalizada del DataSet completo, similar a DataView, pero con relaciones incluidas. Con una colección DataViewSettings, se pueden establecer opciones de ordenación y filtros predeterminados de cualquier vista que DataViewManager tenga para una tabla determinada.

Tipos de enlace de datos

Windows Forms puede aprovechar las ventajas de dos tipos de enlace de datos: enlace simple y enlace complejo. Cada uno ofrece diferentes ventajas.

Tipo de enlace de datos Descripción
Enlace de datos simple Capacidad de un control para enlazarse a un único elemento de datos como, por ejemplo, un valor que existe en una columna de una tabla de conjunto de datos. El enlace de datos simple es el tipo de enlace habitual de controles tales como TextBox o Label, que son controles que suelen mostrar un único valor. De hecho, se puede enlazar cualquier propiedad de un control a un campo de una base de datos. Visual Studio es altamente compatible con esta característica.

Para obtener más información, consulte Explorar datos y Creación de un control enlazado simple (Windows Forms para .NET).
Enlace de datos complejo Capacidad de un control para enlazarse a más de un elemento de datos; normalmente, a más de un registro en una base de datos. El enlace complejo también se denomina enlace basado en lista. DataGridView, ListBox y ComboBox son ejemplos de controles que admiten el enlace complejo. Para ver un ejemplo de enlace de datos complejos, vea Cómo: Enlazar un control ComboBox o ListBox de formularios Windows Forms a datos.

Componente del origen de enlace

Para simplificar el enlace de datos, Windows Forms permite enlazar un origen de datos al componente BindingSource y, a continuación, enlazar controles a BindingSource. Puede utilizar BindingSource en escenarios de enlace simple o complejo. En cualquier caso, BindingSource actúa como intermediario entre el origen de datos y los controles enlazados, y proporciona gestión de divisas con notificación de cambios y otros servicios.

Escenarios comunes que emplean el enlace de datos

Casi todas las aplicaciones comerciales utilizan información leída de orígenes de datos de un tipo u otro, normalmente a través del enlace de datos. La lista siguiente muestra algunos de los escenarios más comunes que utilizan el enlace de datos como método de manipulación y presentación de los datos.

Escenario Descripción
Generación de informes Los informes permiten mostrar y resumir los datos en un documento impreso de modo flexible. Es común crear un informe que imprima contenido seleccionado de un origen de datos en la pantalla o en una impresora. Entre los informes comunes están las listas, las facturas y los resúmenes. Los elementos tienen un formato de columnas de listas, con elementos secundarios organizados bajo cada elemento de la lista; sin embargo, debe elegir el diseño que mejor se adapte a los datos.
Entrada de datos Es una forma común de introducir grandes cantidades de datos relacionados o de solicitar información a los usuarios a través de un formulario de entrada de datos. Los usuarios pueden escribir la información o seleccionar opciones mediante cuadros de texto, botones de opción, listas desplegables y casillas. La información se envía y se almacena a continuación en una base de datos, cuya estructura se basa en la información especificada.
Relación principal-detalle Una aplicación principal-detalle es un formato para examinar datos relacionados. En concreto, hay dos tablas de datos con una relación que las conecta en el ejemplo de empresa clásico, una tabla "Clientes" y una tabla "Pedidos" con una relación entre ellos que vincula los clientes y sus respectivos pedidos. Para obtener más información sobre la creación de una aplicación maestra/detalle con dos controles Windows Forms DataGridView, vea Cómo: Crear un formulario principal-detalle mediante dos controles DataGridView de formularios Windows Forms
Tabla de búsqueda Otro escenario común de presentación o manipulación de datos es la tabla de búsqueda. A menudo, como parte de una presentación de datos mayor, se usa un control ComboBox para mostrar y manipular datos. La clave es que los datos que se muestran en el control ComboBox son diferentes de los datos escritos en la base de datos. Por ejemplo, si tiene un control ComboBox que muestra los elementos disponibles en una tienda de comestibles, probablemente desee ver los nombres de los productos (pan, leche, huevos). Sin embargo, para facilitar la recuperación de la información en la base de datos y para lograr la normalización de la base de datos, probablemente almacene la información de los elementos específicos de un determinado pedido como códigos de artículo (501, 603, etc.). Por lo tanto, existe una conexión implícita entre el "nombre descriptivo" del artículo de alimentación en el control ComboBox de su formulario y el número de artículo relacionado presente en un pedido. Esta es la esencia de una búsqueda en la tabla. Para obtener más información, vea Cómo: Crear una tabla de búsqueda con el componente BindingSource de formularios Windows Forms.

Vea también