Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En Windows Forms, puede enlazar no solo a orígenes de datos tradicionales, sino también a casi cualquier estructura que contenga datos. Puede enlazar a una matriz de valores que calcule en tiempo de ejecución, lea de un archivo o derive de los valores de otros controles.
Además, puede enlazar cualquier propiedad de cualquier control al origen de datos. En el enlace de datos tradicional, normalmente se enlaza la propiedad de visualización (por ejemplo, la propiedad Text de un elemento de control TextBox) al origen de datos. Con .NET, también tiene la opción de establecer otras propiedades mediante el enlace. Puede usar la vinculación para realizar las siguientes tareas:
Establecer el gráfico de un control de imagen.
Establecer el color de fondo de uno o varios controles.
Establecer el tamaño de los controles.
Básicamente, el enlace de datos es una forma automática de establecer cualquier propiedad accesible en tiempo de ejecución de cualquier control de un formulario.
Interfaces relacionadas con el enlace de datos
ADO.NET permite crear muchas estructuras de datos diferentes 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 Formularios Windows Forms. Estos objetos pueden ofrecer distintos niveles de funcionalidad y complejidad. Desde el enlace de datos básico, pasando por el soporte en tiempo de diseño, la comprobación de errores, la notificación de cambios, hasta incluso el soporte para una reversión estructurada de los cambios realizados 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 interfaces es implementado por los autores de origen de datos en las fuentes de datos. Los consumidores del origen de datos, como los controles o componentes de Windows Forms, implementan estas interfaces. El segundo grupo de interfaz está diseñado para que lo usen los autores de componentes. Los autores de componentes usan estas interfaces cuando crean un componente que admite el enlace de datos y que será consumido por el motor de enlace de datos de Windows Forms. 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 aprovechan esta funcionalidad.
Interfaces para la implementación por autores de orígenes de datos
Los controles de Windows Forms implementan las interfaces siguientes:
interfaz IList
Una clase que implementa la IList interfaz podría ser , ArrayArrayListo 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
solo estaría disponible para el enlace en tiempo de ejecución.Nota:
Si desea crear una lista de objetos empresariales para enlazar con Windows Forms, considere la posibilidad de usar .BindingList<T>
BindingList
es una clase extensible que implementa las interfaces principales necesarias para el enlace de datos bidireccional de Windows Forms.interfaz IBindingList
Una clase que implementa la IBindingList interfaz proporciona un nivel mucho mayor de funcionalidad de enlace de datos. Esta implementación le ofrece funcionalidades básicas de ordenación y notificación de cambios. Ambos 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 realizar cambios en los datos realizados en uno de los controles para propagarse a los otros controles enlazados.
Nota:
La notificación de cambio está habilitada para la interfaz mediante la propiedad IBindingListSupportsChangeNotification, que, cuando
true
, genera el evento ListChanged, indicando que la lista ha cambiado o un elemento de la lista ha cambiado.El tipo de cambio se describe mediante la ListChangedType propiedad del ListChangedEventArgs parámetro . Por lo tanto, siempre que se actualice el modelo de datos, también se actualizarán las vistas dependientes, como otros controles enlazados al mismo origen de datos. Sin embargo, los objetos contenidos en la lista tendrán que notificar a la lista cuando cambien para que la lista pueda generar el ListChanged evento.
Nota:
BindingList<T> proporciona una implementación genérica de la IBindingList interfaz .
interfaz IBindingListView
Una clase que implementa la IBindingListView interfaz proporciona toda la funcionalidad de una implementación de IBindingList, junto con la funcionalidad de filtrado y ordenación avanzada. Esta implementación ofrece filtrado basado en cadenas y ordenación multicriterio con pares descriptor de propiedad-dirección.
interfaz IEditableObject
Una clase que implementa la IEditableObject interfaz permite a un objeto controlar cuándo se realizan cambios en ese objeto de forma permanente. Esta implementación admite los BeginEditmétodos , EndEdity CancelEdit , que permiten revertir los cambios realizados en el objeto . A continuación se muestra una breve explicación del funcionamiento de los
BeginEdit
métodos ,EndEdit
y yCancelEdit
cómo funcionan entre sí para habilitar una posible reversión de los cambios realizados en los datos:El BeginEdit método indica el inicio de una edición en un objeto . Un objeto que implemente esta interfaz deberá almacenar las actualizaciones después de la llamada al
BeginEdit
método de forma que se puedan descartar las actualizaciones si se llama al CancelEdit método . En la vinculación de datos en Windows Forms, puede llamar aBeginEdit
varias veces en el contexto de una sola transacción de edición (por ejemplo,BeginEdit
,BeginEdit
, EndEdit). Las implementaciones de IEditableObject deben mantener un registro de siBeginEdit
ya ha sido llamado y omitir las llamadas posteriores aBeginEdit
. Dado que se puede llamar a este método varias veces, es importante que las llamadas posteriores a él no sean destructivas. Las llamadas posterioresBeginEdit
no pueden destruir las actualizaciones realizadas o cambiar los datos guardados en la primeraBeginEdit
llamada.El método EndEdit aplica los cambios al objeto subyacente desde que se llamó BeginEdit, si el objeto está actualmente en modo de edición.
El CancelEdit método descarta los cambios realizados en el objeto .
Para obtener más información sobre cómo funcionan los BeginEditmétodos , EndEdity CancelEdit , vea Guardar datos de nuevo en la base de datos.
El control de DataGridView utiliza esta noción transaccional de la funcionalidad de datos.
interfaz ICancelAddNew
Una clase que implementa la ICancelAddNew interfaz normalmente implementa la IBindingList interfaz y permite revertir una adición realizada al origen de datos con el AddNew método . Si el origen de datos implementa la interfaz
IBindingList
, también debería implementar la interfazICancelAddNew
.interfaz IDataErrorInfo
Una clase que implementa la IDataErrorInfo interfaz permite a los objetos ofrecer información de error personalizada a los controles enlazados:
interfaz IEnumerable
Normalmente, ASP.NET consume una clase que implementa la IEnumerable interfaz. La compatibilidad con Windows Forms para esta interfaz solo está disponible a través del BindingSource componente .
Nota:
El BindingSource componente copia todos los IEnumerable elementos en una lista independiente con fines de enlace.
interfaz ITypedList
Una clase de colecciones que implementa la ITypedList interfaz proporciona la capacidad de controlar el orden y el conjunto de propiedades que se exponen al control enlazado.
Nota:
Al implementar 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.
interfaz ICustomTypeDescriptor
Una clase que implementa la ICustomTypeDescriptor interfaz proporciona información dinámica sobre sí misma. Esta interfaz es similar a ITypedList pero se usa para objetos en lugar de listas. Esta interfaz se usa para DataRowView proyectar el esquema de las filas subyacentes. La
ICustomTypeDescriptor
clase proporciona una implementación sencilla de CustomTypeDescriptor .Nota:
Para admitir el enlace en tiempo de diseño a los tipos que implementan ICustomTypeDescriptor, el tipo también debe implementar IComponent y existir como una instancia en el Formulario.
interfaz IListSource
Una clase que implementa la interfaz habilita el IListSource enlace basado en listas en objetos que no son de lista. El GetList método de
IListSource
se usa para devolver una lista enlazable de un objeto que no hereda de IList.La claseIListSource
usa DataSet.interfaz IRaiseItemChangedEvents
Una clase que implementa la IRaiseItemChangedEvents interfaz es una lista enlazable que también implementa la IBindingList interfaz. Esta interfaz se usa para indicar si el tipo genera ListChanged eventos de tipo ItemChanged a través de su RaisesItemChangedEvents propiedad .
Nota:
Debe implementar el IRaiseItemChangedEvents si su origen de datos proporciona la propiedad para enumerar la conversión de eventos, descrita anteriormente, y está interactuando con el componente BindingSource. De lo contrario, la
BindingSource
también llevará a cabo la conversión de propiedades a eventos de lista, lo que provocará un rendimiento más lento.interfaz ISupportInitialize
Un componente que implementa la interfaz ISupportInitialize aprovecha las optimizaciones por lotes para establecer propiedades e inicializar propiedades co-dependientes.
ISupportInitialize
contiene dos métodos:interfaz ISupportInitializeNotification
Un componente que implementa la ISupportInitializeNotification interfaz también implementa la ISupportInitialize interfaz. Esta interfaz le permite notificar a otros
ISupportInitialize
componentes que la inicialización está completa. LaISupportInitializeNotification
interfaz contiene dos miembros:IsInitialized devuelve un
boolean
valor que indica si el componente se inicializa.Initialized se produce cuando se llama a EndInit.
interfaz INotifyPropertyChanged
Una clase que implementa esta interfaz es un tipo que genera un evento cuando cambian 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 un BindingList<T>, un objeto de negocio debe implementar la interfaz INotifyPropertyChanged, y BindingList`1 convertirá eventos PropertyChanged en eventos ListChanged de tipo ItemChanged.
Nota:
Para que se produzca una notificación de cambio en un enlace entre un cliente enlazado y un origen de datos, el tipo de origen de datos enlazado debe implementar la INotifyPropertyChanged interfaz (preferida) o puede proporcionar eventos propertyName
Changed
para el tipo enlazado, pero no debe hacer ambos.
Interfaces para la implementación por parte de los autores de componentes
Las interfaces siguientes están diseñadas para su consumo por parte del motor de enlace de datos de Windows Forms:
interfaz IBindableComponent
Una clase que implementa esta interfaz es un componente que no es de control que admite el enlace de datos. Esta clase devuelve los enlaces de datos y el contexto de enlace del componente a través de las DataBindings propiedades y BindingContext de esta interfaz.
Nota:
Si el componente hereda de Control, no es necesario implementar la IBindableComponent interfaz .
interfaz ICurrencyManagerProvider
Una clase que implementa la ICurrencyManagerProvider interfaz es un componente que proporciona su propio CurrencyManager para administrar los enlaces asociados a este componente en particular. El acceso al personalizado
CurrencyManager
es proporcionado por la propiedad CurrencyManager.Nota:
Una clase que hereda de Control administra los enlaces automáticamente a través de su BindingContext propiedad, por lo que los casos en los que necesita implementar ICurrencyManagerProvider son bastante poco frecuentes.
Orígenes de datos compatibles con Windows Forms
Tradicionalmente, el enlace de datos se ha usado dentro de las aplicaciones para aprovechar los datos almacenados en bases de datos. Con el enlace de datos de Windows Forms, puede acceder a datos de bases de datos y datos de otras estructuras, como matrices y colecciones, siempre y cuando se hayan cumplido determinados requisitos mínimos.
Estructuras para enlazar
En Windows Forms, puede enlazar a una amplia variedad de estructuras, desde objetos simples (enlace simple) a listas complejas, como ADO.NET tablas de datos (enlace complejo). Para el enlace simple, Windows Forms admite el enlace a las propiedades públicas en el objeto simple. Por lo general, el enlace basado en listas de Windows Forms requiere que el objeto admita la IList interfaz o la IListSource interfaz. Además, si va a enlazar a través de un componente BindingSource, puede enlazar con un objeto que admita la interfaz IEnumerable.
En la lista siguiente se muestran las estructuras a las que puede enlazar en Formularios Windows Forms.
-
A BindingSource es el origen de datos de Windows Forms más común y actúa como proxy entre un origen de datos y controles de Windows Forms. El patrón de uso general
BindingSource
consiste en enlazar sus controles aBindingSource
y enlazarBindingSource
al origen de datos (por ejemplo, una tabla de datos ADO.NET o un objeto de negocio).BindingSource
proporciona servicios que habilitan y mejoran el nivel de soporte de enlace de datos. Por ejemplo, los controles basados en listas de Windows Forms, como DataGridView y ComboBox, no admiten directamente el enlace a IEnumerable fuentes de datos; sin embargo, puede habilitar este escenario mediante el enlace a través de unBindingSource
. En este caso,BindingSource
convertirá el origen de datos en un IList. Objetos simples
Windows Forms admite propiedades de control de enlace de datos a propiedades públicas en la instancia de un objeto mediante el Binding tipo . Los formularios Windows Forms también admiten controles de enlace basados en listas, como la vinculación de ListControl a una instancia de objeto cuando se utiliza BindingSource.
Matriz o colección
Para actuar como origen de datos, una lista debe implementar la IList interfaz; un ejemplo sería una matriz que es una instancia de la Array clase . Para obtener más información sobre las matrices, vea How to: Create an Array of Objects (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 IBindingList interfaz. LaIBindingList
interfaz amplía la IList interfaz agregando 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 IEnumerable interfaz si están enlazados a través de un BindingSource componente.
ADO.NET objetos de datos
ADO.NET proporciona muchas estructuras de datos adecuadas para el enlace. Cada uno varía en su sofisticación y complejidad.
-
A DataColumn es el bloque de creación esencial de un DataTable, ya que varias columnas forman una tabla. Cada
DataColumn
tiene una DataType propiedad que determina el tipo de datos que contiene la columna (por ejemplo, la marca de un automóvil en una tabla que describe los coches). Puede vincular un control mediante enlace simple (como la propiedad de un control TextBox) a una columna dentro de una tabla de datos. -
Una 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 determinada (que en última instancia determinan los tipos de datos que se pueden introducir en esa tabla) y DataRow, que representan las filas de datos de una tabla determinada. Puede enlazar un control complejo a la información contenida en una tabla de datos (por ejemplo, enlazar el DataGridView control a una tabla de datos). Sin embargo, cuando te enlazas a
DataTable
, estás enlazando a la vista predeterminada de la tabla. -
DataView es una vista personalizada de una sola tabla de datos que se puede filtrar o ordenar. Una vista de datos es la "instantánea de los datos" utilizada por los controles vinculados a objetos complejos. Puede enlazar de forma sencilla o compleja a los datos dentro de una vista de datos, pero tenga en cuenta que está enlazando a una "imagen" fija de los datos en lugar de a una fuente de datos actualizada.
-
A DataSet es una colección de tablas, relaciones y restricciones de los datos de una base de datos. Puede enlazar de forma simple o compleja a los datos de un conjunto de datos, pero tenga en cuenta que está enlazando al valor predeterminado DataViewManager para
DataSet
(consulte el siguiente elemento). -
A DataViewManager es una vista personalizada de todo DataSet, análoga a un DataView, pero con relaciones incluidas. Con una DataViewSettings colección, puede establecer filtros predeterminados y opciones de ordenación para cualquier vista que tenga
DataViewManager
para una tabla determinada.
-
Tipos de enlace de datos
Windows Forms puede aprovechar 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 | La capacidad de un control para enlazar a un único elemento de datos, como un valor en una columna de una tabla de conjunto de datos. El enlace de datos simple es el tipo de enlace típico para controles como un TextBox control o Label control, que son controles que normalmente solo muestran un solo valor. De hecho, cualquier propiedad de un control se puede enlazar a un campo de una base de datos. Hay una amplia compatibilidad con esta característica en Visual Studio. Para obtener más información, vea Navegar por datos y Crear un control enlazado simple (Windows Forms .NET). |
Enlace de datos complejo | La capacidad de un control para enlazar a más de un elemento de datos, normalmente más de un registro de una base de datos. El enlace complejo también se denomina enlace basado en listas. Algunos ejemplos de controles que admiten enlaces complejos son los DataGridViewcontroles , ListBoxy ComboBox . Para obtener un ejemplo de enlace de datos complejo, vea How to: Bind a Windows Forms ComboBox or ListBox Control to Data. |
Componente de origen de enlace
Para simplificar el enlace de datos, Windows Forms permite enlazar un origen de datos al BindingSource componente y, a continuación, enlazar los controles al BindingSource
. Puede usar el BindingSource
en escenarios de enlace simples o complejos. En cualquier caso, el BindingSource
actúa como intermediario entre el origen de datos y los controles enlazados, proporcionando notificación de cambios, gestión de moneda y otros servicios.
Escenarios comunes que emplean el enlace de datos
Casi todas las aplicaciones comerciales usan información leída de orígenes de datos de un tipo u otro, normalmente a través del enlace de datos. En la lista siguiente se muestran algunos de los escenarios más comunes que usan el enlace de datos como método de presentación y manipulación de datos.
Escenario | Descripción |
---|---|
Informes | Los informes proporcionan una manera flexible de mostrar y resumir los datos en un documento impreso. Es habitual crear un informe que imprima el contenido seleccionado de un origen de datos en la pantalla o en una impresora. Los informes comunes incluyen listas, facturas y resúmenes. Los elementos tienen formato en columnas de listas, con subelementos organizados en cada elemento de lista, pero debe elegir el diseño que mejor se adapte a los datos. |
Entrada de datos | Una manera común de escribir grandes cantidades de datos relacionados o solicitar a los usuarios información es a través de un formulario de entrada de datos. Los usuarios pueden escribir información o seleccionar opciones mediante cuadros de texto, botones de opción, listas desplegables y casillas. A continuación, la información se envía y almacena en una base de datos, cuya estructura se basa en la información especificada. |
Relación maestro/detalle | Una aplicación master/detail es un formato para examinar los datos relacionados. En concreto, hay dos tablas de datos con una relación en el clásico ejemplo empresarial: una tabla "Clientes" y una tabla "Pedidos" con una relación que vincula a los clientes con sus respectivos pedidos. Para obtener más información sobre cómo crear una aplicación maestra o detallada con dos controles de Windows Forms DataGridView , vea How to: Create a Master/Detail Form Using Two Windows Forms DataGridView Controls. |
Tabla de búsqueda | Otro escenario común de presentación o manipulación de datos es la búsqueda de tablas. A menudo, como parte de una presentación de datos más grande, se usa un ComboBox control para mostrar y manipular datos. La clave es que los datos mostrados en el ComboBox control son diferentes de los datos escritos en la base de datos. Por ejemplo, si tiene un ComboBox control que muestra los artículos disponibles en una tienda de comestibles, probablemente le gustaría ver los nombres de los productos (pan, leche, huevos). Sin embargo, para facilitar la recuperación de información dentro de la base de datos y para la normalización de la base de datos, probablemente almacenaría la información de los elementos específicos de un pedido determinado como números de elemento (#501, #603, etc.). Por lo tanto, hay una conexión implícita entre el "nombre descriptivo" del artículo de comestibles en el ComboBox control del formulario y el número de artículo relacionado que está presente en un pedido. Es la esencia de una búsqueda de tabla. Para obtener más información, vea Cómo: Crear una tabla de búsqueda con el componente Windows Forms BindingSource. |
Consulte también
.NET Desktop feedback