Share via


Arquitectura del componente BindingSource

Con el componente BindingSource, puede enlazar universalmente todos los controles de Windows Forms a orígenes de datos.

El componente BindingSource simplifica el proceso de enlace de controles a un origen de datos y proporciona las siguientes ventajas en comparación con el enlace de datos tradicional:

  • Permite el enlace en tiempo de diseño a objetos empresariales.

  • Encapsula la funcionalidad CurrencyManager y expone eventos CurrencyManager en tiempo de diseño.

  • Simplifica la creación de una lista que admita la interfaz IBindingList proporcionando una notificación de cambio de lista para los orígenes de datos que no admiten de forma nativa la notificación de cambios de lista.

  • Proporciona un punto de extensibilidad para el método IBindingList.AddNew.

  • Proporciona un nivel de direccionamiento indirecto entre el origen de datos y el control. Este direccionamiento indirecto es importante cuando el origen de datos puede cambiar en tiempo de ejecución.

  • Interopera con otros controles de Windows Forms relacionados con los datos, específicamente los controles BindingNavigator y DataGridView.

Por estos motivos, el componente BindingSource es la forma preferida de enlazar los controles de Windows Forms a orígenes de datos.

Características de BindingSource

El componente BindingSource proporciona varias características para enlazar controles a datos. Con estas características, puede implementar la mayoría de los escenarios de enlace de datos prácticamente sin escribir código.

El componente BindingSource lo logra proporcionando una interfaz coherente para acceder a muchos tipos diferentes de orígenes de datos. Esto significa que se usa el mismo procedimiento para el enlace a cualquier tipo. Por ejemplo, puede adjuntar la propiedad DataSource a un elemento DataSet o a un objeto empresarial y, en ambos casos, se usa el mismo conjunto de propiedades, métodos y eventos para manipular el origen de datos.

La interfaz coherente proporcionada por el componente BindingSource simplifica considerablemente el proceso de enlace de datos a los controles. En el caso de los tipos de origen de datos que proporcionan notificaciones de cambios, el componente BindingSource comunica automáticamente los cambios entre el control y el origen de datos. En el caso de los tipos de origen de datos que no proporcionan notificaciones de cambios, se proporcionan eventos que le permiten generar notificaciones de cambios. En la lista siguiente se muestran las características admitidas por el componente BindingSource:

Direccionamiento indirecto

El componente BindingSource proporciona un nivel de direccionamiento indirecto entre un control y un origen de datos. En lugar de enlazar un control directamente a un origen de datos, se enlaza el control a BindingSource y se adjunta el origen de datos a la propiedad DataSource del componente BindingSource.

Con este nivel de direccionamiento indirecto, puede cambiar el origen de datos sin restablecer el enlace del control. Esto permite lo siguiente:

Administración de monedas

El componente BindingSource implementa la interfaz ICurrencyManagerProvider para controlar la administración de monedas por usted. Con la interfaz ICurrencyManagerProvider, también puede acceder al administrador de moneda para BindingSource, además del administrador de moneda para otro BindingSource enlazado al mismo DataMember.

El componente BindingSource encapsula la funcionalidad CurrencyManager y expone las propiedades y eventos de CurrencyManager más habituales. En la tabla siguiente se describen algunos de los miembros relacionados con la administración de monedas.

Propiedad CurrencyManager
Permite obtener el administrador de moneda asociado a BindingSource.

Método GetRelatedCurrencyManager
Si hay otro BindingSource enlazado al miembro de datos especificado, obtiene su administrador de monedas.

Propiedad Current
Obtiene el elemento actual del origen de datos.

Propiedad Position
Obtiene o establece la posición actual en la lista subyacente.

Método EndEdit
Aplica los cambios pendientes al origen de datos subyacente.

Método CancelEdit
Cancela la operación de edición actual.

Origen de datos como lista

El componente BindingSource implementa las interfaces IBindingListView y ITypedList. Con esta implementación, puede usar el propio componente BindingSource como origen de datos, sin ningún almacenamiento externo.

Cuando el componente BindingSource se adjunta a un origen de datos, expone el origen de datos como una lista.

La propiedad DataSource se puede establecer en varios orígenes de datos. Incluyen tipos, objetos y listas de tipos. El origen de datos resultante se expondrá como una lista. En la tabla siguiente se muestran algunos de los orígenes de datos habituales y la evaluación de lista resultante.

Propiedad DataSource Resultados de la lista
Una referencia nula (Nothing en Visual Basic) IBindingList de objetos vacío. Al agregar un elemento, se establece la lista en el tipo del elemento agregado.
Una referencia nula (Nothing en Visual Basic) con DataMember definido No admitido; genera ArgumentException.
Tipo diferente de una lista u objeto del tipo "T" IBindingList de tipo "T" vacío.
Instancia de matriz IBindingList que contiene los elementos de la matriz.
Instancia de IEnumerable IBindingList que contiene los elementos IEnumerable
Instancia de lista que contiene el tipo "T" Instancia de IBindingList que contiene el tipo "T".

Además, DataSource se puede establecer en otros tipos de lista, como IListSource y ITypedList, y BindingSource los controlará correctamente. En este caso, el tipo que contiene la lista debe tener un constructor sin parámetros.

BindingSource como IBindingList

El componente BindingSource proporciona miembros para acceder a los datos subyacentes y manipularlos como IBindingList. La tabla siguiente describe algunos de estos miembros.

Miembro Descripción
Propiedad List Permite obtener la lista resultante de la evaluación de las propiedades DataSource o DataMember.
Método AddNew Agrega un nuevo elemento a la lista subyacente. Se aplica a los orígenes de datos que implementan la interfaz IBindingList y permiten agregar elementos (es decir, la propiedad AllowNew se establece en true).

Creación de elementos personalizados

Puede controlar el evento AddingNew para proporcionar su propia lógica de creación de elementos. El evento AddingNew se produce antes de que se agregue un nuevo objeto a BindingSource. Este evento se genera después de llamar al método AddNew, pero antes de que se agregue el nuevo elemento a la lista subyacente. Al controlar este evento, puede proporcionar un comportamiento de creación de elementos personalizado sin derivar de la clase BindingSource. Para obtener más información, consulte Cómo: Personalizar la forma de agregar elementos con el control BindingSource de Windows Forms.

Creación de elementos transaccionales

El componente BindingSource implementa la interfaz ICancelAddNew, que permite la creación de elementos transaccionales. Después de crear provisionalmente un nuevo elemento mediante una llamada a AddNew, la adición se puede confirmar o revertir de las maneras siguientes:

  • El método EndNew confirmará explícitamente la adición pendiente.

  • Otra operación de colección, como una inserción, eliminación o movimiento, confirmará implícitamente la adición pendiente.

  • El método CancelNew revertirá la adición pendiente si el método aún no se ha confirmado.

Compatibilidad con IEnumerable

El componente BindingSource permite enlazar controles a orígenes de datos IEnumerable. Con este componente, puede enlazarlos a un origen de datos como System.Data.SqlClient.SqlDataReader.

Cuando se asigna un origen de datos IEnumerable al componente BindingSource, BindingSource crea IBindingList y agrega el contenido del origen de datos IEnumerable a la lista.

Compatibilidad en tiempo de diseño

Algunos tipos de objetos no se pueden crear en tiempo de diseño, como objetos creados a partir de una clase de fábrica o objetos devueltos por un servicio web. A veces es posible que tenga que enlazar los controles a estos tipos en tiempo de diseño, aunque no haya ningún objeto en memoria al que se puedan enlazar los controles. Por ejemplo, es posible que tenga que etiquetar los encabezados de columna de un control DataGridView con los nombres de las propiedades públicas del tipo personalizado.

Para admitir este escenario, el componente BindingSource admite el enlace a Type. Al asignar un elemento Type a la propiedad DataSource, el componente BindingSource crea un elemento BindingList<T> vacío de elementos Type. Los controles enlazados posteriormente al componente BindingSource recibirán un aviso de la presencia de las propiedades o el esquema del tipo en tiempo de diseño, o en tiempo de ejecución. Para obtener más información, consulte Cómo: Enlazar un control de Windows Forms a un tipo.

Métodos de ListBindingHelper estático

Los tipos System.Windows.Forms.BindingContext, System.Windows.Forms.CurrencyManager y BindingSource comparten lógica común para generar una lista a partir de un par DataSource/DataMember. Además, esta lógica común se expone públicamente para su uso por parte de autores de controles y otros terceros en los métodos static siguientes:

Ordenación y filtrado con la interfaz IBindingListView

El componente BindingSource implementa la interfaz IBindingListView, que extiende la interfaz IBindingList. IBindingList ofrece la ordenación de columna única y IBindingListView ofrece la ordenación y filtrado avanzados. Con IBindingListView, puede ordenar y filtrar elementos en el origen de datos, si el origen de datos también implementa una de estas interfaces. El componente BindingSource no proporciona una implementación de referencia de estos miembros. En su lugar, las llamadas se reenvían a la lista subyacente.

En la tabla siguiente se describen las propiedades que se usan para ordenar y filtrar.

Miembro Descripción
Propiedad Filter Si el origen de datos es una IBindingListView, obtiene o establece la expresión usada para filtrar qué filas se ven.
Propiedad Sort Si el origen de datos es una IBindingList, obtiene o establece el nombre de columna usado para ordenar y el criterio de ordenación.

O bien

Si el origen de datos es un elemento IBindingListView y admite la ordenación avanzada, obtiene varios nombres de columna usados para ordenar y el criterio de ordenación.

Integración con BindingNavigator

Puede usar el componente BindingSource para enlazar cualquier control de Windows Forms a un origen de datos, pero el control BindingNavigator está diseñado específicamente para funcionar con el componente BindingSource. El control BindingNavigator proporciona una interfaz de usuario para controlar el elemento actual del componente BindingSource. De forma predeterminada, el control BindingNavigator proporciona botones que corresponden a los métodos de navegación del componente BindingSource. Para obtener más información, consulte Cómo: Explorar datos con el control BindingNavigator de Windows Forms.

Consulte también