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.
Interfaces relacionadas con el enlace de datos
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
yCancelEdit
, 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 aBeginEdit
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 aBeginEdit
y omitir las llamadas subsiguientes aBeginEdit
. 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 aBeginEdit
no pueden destruir las actualizaciones realizadas ni cambiar los datos guardados en la primera llamada aBeginEdit
.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 interfazICancelAddNew
.IDataErrorInfo (interfaz)
Una clase que implementa la interfaz IDataErrorInfo permite que los objetos ofrezcan información personalizada sobre errores a los controles enlazados:
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 utilizaIListSource
.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: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 interfazISupportInitializeNotification
contiene dos miembros:IsInitialized devuelve un valor
boolean
que indica si el componente se ha inicializado.Initialized sucede cuando se llama a EndInit.
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 propertyName
Changed
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:
IBindableComponent (interfaz)
Una clase que implementa esta interfaz es un componente no de control que admite el enlace de datos. Esta clase devuelve los enlaces de datos y el contexto de enlace del componente mediante las propiedades DataBindings y BindingContext de esta interfaz.
Nota:
Si el componente se hereda de Control, no es necesario implementar la interfaz IBindableComponent.
ICurrencyManagerProvider (interfaz)
Una clase que implementa la interfaz ICurrencyManagerProvider es un componente que proporciona su propio CurrencyManager para administrar los enlaces asociados con este componente determinado. La propiedad CurrencyManager proporciona acceso al objeto
CurrencyManager
personalizado.Nota:
Una clase que se hereda de Control administra enlaces automáticamente mediante la propiedad BindingContext, de modo que es muy poco frecuente que se den casos en los que necesite implementar ICurrencyManagerProvider.
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 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 aBindingSource
y enlazarBindingSource
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 deBindingSource
. 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 interfazIBindingList
amplía la interfaz IList al agregar las propiedades, métodos y eventos necesarios para el enlace de datos bidireccional.-
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 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 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 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 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 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
.NET Desktop feedback