Interfaces relacionadas con el enlace de datos
Con ADO.NET, puede crear muchas estructuras de datos distintas para satisfacer las necesidades de enlace de la aplicación y de los datos con los que trabaja. Quizá desee crear sus propias clases que proporcionen o utilicen datos de formularios Windows Forms. Estos objetos pueden ofrecer diversos niveles de funcionalidad y complejidad, desde el enlace básico de datos hasta la compatibilidad en tiempo de diseño, la comprobación de errores, la notificación de cambios o, incluso, la compatibilidad con una reversión estructurada de las modificaciones realizadas 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 muestra interfaces que se implementan en orígenes de datos por autores de orígenes de datos. Estas interfaces están diseñadas para que consumidores del origen de datos las utilicen, que la mayoría de los casos son controles o componentes de formularios Windows Forms. El segundo grupo muestra interfaces diseñadas para que las utilicen los autores de componentes. Los autores de componentes utilizan estas interfaces cuando crean componentes que admiten que el motor de enlace de datos de formularios Windows Forms utilice el enlace de datos. Estas interfaces pueden implementarse en las clases asociadas al formulario para habilitar el enlace de datos; cada caso presenta una clase que implementa una interfaz que habilita la interacción con los datos. Las herramientas con experiencia en diseño de datos de desarrollo rápido de aplicaciones (RAD) de Visual Studio ya aprovechan esta funcionalidad.
Interfaces para la implementación de los autores de orígenes de datos
Las interfaces siguientes están diseñadas para ser utilizadas por controles de formularios Windows Forms:
La interfaz IList
Una clase que implementa la interfaz IList podría ser Array, ArrayList o CollectionBase. Estas son listas de elementos indizadas de tipo Object. Estas listas deben contener tipos homogéneos porque el primer elemento del índice determina el tipo. IList solo debe estar disponible para el enlace en tiempo de ejecución.
Nota
Si desea crear una lista de objetos comerciales para enlaces con formularios Windows Forms, considere utilizar la clase BindingList<T>. BindingList<T> es una clase extensible que implementa las interfaces principales necesarias para el enlace de datos bidireccional de formularios Windows Forms.
La interfaz IBindingList
Una clase que implementa la interfaz IBindingList proporciona un nivel mucho mayor de funcionalidad de enlace de datos. Esta implementación ofrece posibilidades de ordenación básicas y notificación de cambios, ambas para cuando cambian los elementos de lista (por ejemplo, el tercer elemento de una lista de clientes tiene un cambio en el campo Dirección), así como cuando cambia la lista en sí (por ejemplo, aumenta o disminuye el número de elementos de la lista). Es importante la notificación de cambios si tiene previsto tener varios controles enlazados a los mismos datos y desea que los cambios de datos realizados en uno de los controles se propaguen a los demás controles enlazados.
Nota
La notificación de cambios para la interfaz IBindingList se habilita mediante la propiedad SupportsChangeNotification que, cuando es true, provoca un evento ListChanged, que indica que ha cambiado la lista o un elemento de la lista.
La propiedad ListChangedType del parámetro ListChangedEventArgs describe el tipo de cambio. Por lo tanto, cada vez que se actualiza el modelo de datos, cualquier vista dependiente, como otros controles enlazados al mismo origen de datos, también se actualizará. No obstante, cuando los objetos contenidos en la lista cambien deberán enviar una notificación a la lista, para que ésta pueda provocar el evento ListChanged.
Nota
La clase BindingList<T> proporciona una implementación genérica de la interfaz IBindingList.
La interfaz IBindingListView
Una clase que implementa la interfaz IBindingListView proporciona todas las funciones de una implementación de IBindingList, así como funciones de filtrado y ordenación avanzada. Esta implementación proporciona el filtrado basado en cadena y la ordenación multicolumna con pares de descriptor de propiedad y dirección.
La interfaz IEditableObject
Una clase que implementa la interfaz IEditableObject permite que un objeto controle cuándo se hacen permanentes los cambios realizados en el objeto. Esta implementación ofrece los métodos BeginEdit, EndEdit y CancelEdit, que le permiten revertir los cambios realizados en el objeto. A continuación figura una breve descripción del funcionamiento de los métodos BeginEdit, EndEdit y CancelEdit y cómo funcionan entre ellos para permitir la posibilidad de revertir los cambios realizados en los datos:
El método BeginEdit señala el inicio de una modificación de un objeto. Un objeto que implemente esta interfaz necesitará almacenar las actualizaciones que se produzcan después de la llamada al método BeginEdit de modo que puedan descartarse las actualizaciones si se llama al método CancelEdit. En el enlace de datos de formularios Windows Forms, puede llamar varias veces al método BeginEdit dentro del ámbito de una transacción de edición única (por ejemplo, BeginEdit, BeginEdit, EndEdit). Las implementaciones de IEditableObject deberían mantener el seguimiento que comprueba si se ha llamado ya al método BeginEdit y omitir las llamadas subsiguientes a BeginEdit. Dado que es posible llamar varias veces a este método, es importante que las llamadas subsiguientes no sean destructivas; es decir, las llamadas subsiguientes a BeginEdit no pueden destruir las actualizaciones realizadas ni modificar los datos guardados en la primera llamada a BeginEdit.
El método EndEdit inserta en el objeto subyacente los cambios realizados desde la llamada a BeginEdit, si el objeto se encuentra en modo de edición.
El método CancelEdit descarta 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 en conjuntos de datos.
El control DataGridView utiliza esta noción transaccional de funciones de datos.
La interfaz ICancelAddNew
Una clase que implementa la interfaz ICancelAddNew normalmente implementa la interfaz IBindingList y permite revertir las agregaciones realizadas en el origen de datos con el método AddNew. Si el origen de datos implementa la interfaz IBindingList, establezca también que implemente la interfaz ICancelAddNew.
La interfaz IDataErrorInfo
Una clase que implementa la interfaz IDataErrorInfo permite a los objetos ofrecer la información de error personalizada a los controles enlazados:
La interfaz IEnumerable
ASP.NET utiliza normalmente una clase que implementa la interfaz IEnumerable. Sólo está disponible la compatibilidad de formularios Windows Forms con esta interfaz a través del componente BindingSource.
Nota
El componente BindingSource copia todos los elementos IEnumerable en una lista independiente para fines de enlace.
La interfaz ITypedList
Una clase de colecciones que implementa la interfaz ITypedList proporciona la posibilidad de controlar el orden y el conjunto de propiedades expuestas al control enlazado.
Nota
Cuando implementa el método GetItemProperties y la matriz PropertyDescriptor no es null, la última entrada de la matriz será el descriptor de propiedad que describe la propiedad de lista que es otra lista de elementos.
La interfaz ICustomTypeDescriptor
Una clase que implementa la interfaz ICustomTypeDescriptor proporciona información dinámica sobre sí misma. Esta interfaz es similar a ITypedList pero la utilizan objetos en lugar de listas. DataRowView utiliza esta interfaz para proyectar el esquema de las filas subyacentes. La clase CustomTypeDescriptor proporciona una implementación sencilla de ICustomTypeDescriptor.
Nota
Para admitir el enlace en tiempo de diseño a tipos que implementan ICustomTypeDescriptor, el tipo debe implementar también IComponent y existir como una instancia en el formulario.
La interfaz IListSource
Una clase que implementa la interfaz IListSource habilita el enlace basado en lista en objetos que no son lista. El método GetList de IListSource se usa para devolver una lista enlazable de un objeto que no hereda de IList. La clase DataSet utiliza IListSource.
La interfaz IRaiseItemChangedEvents
Una clase que implementa la interfaz IRaiseItemChangedEvents es una lista enlazable que también implementa la interfaz IBindingList. Esta interfaz se utiliza para indicar si su tipo provoca eventos ListChanged de tipo ItemChanged a través de la propiedad RaisesItemChangedEvents.
Nota
Implemente IRaiseItemChangedEvents 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 ejecutará la conversión de propiedad a evento de lista, lo que provocará un rendimiento más lento.
La interfaz ISupportInitialize
Un componente que implementa la interfaz ISupportInitialize aprovecha las ventajas de las optimizaciones por lotes para establecer las propiedades e inicializar propiedades codependientes. ISupportInitialize contiene dos métodos:
La interfaz ISupportInitializeNotification
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:
IsInitialized devuelve un valor boolean que indica si se inicializa el componente.
Se produce el evento Initialized cuando se llama al método EndInit.
La interfaz INotifyPropertyChanged
Una clase que implementa esta interfaz es un tipo que provoca un evento cuando cualquiera de sus valores de propiedad cambia. Esta interfaz está diseñada para reemplazar al modelo de tener un evento de cambio para cada propiedad de un control. Cuando se utiliza en una clase BindingList<T>, un objeto comercial debe implementar la interfaz INotifyPropertyChanged y BindingList`1 convertirá los eventos PropertyChanged a 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, o el tipo de origen de datos enlazado implementa la interfaz INotifyPropertyChanged (preferido) o puede proporcionar eventos nombreDePropiedadChanged para el tipo enlazado, pero no ambos.
Interfaces para la implementación por creadores de componente
Las interfaces siguientes están diseñadas para que las utilice el motor de enlace de datos de formularios Windows Forms:
La interfaz IBindableComponent
Una clase que implementa esta interfaz es un componente que no sea un 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 propiedades DataBindings y BindingContext de esta interfaz.
Nota
Si el componente hereda de Control, no tiene que implementar la interfaz IBindableComponent.
La interfaz ICurrencyManagerProvider
Una clase que implementa la interfaz ICurrencyManagerProvider es un componente que proporciona su propio CurrencyManager para administrar los enlaces asociados a este componente determinado. La propiedad CurrencyManager proporciona el acceso al CurrencyManager personalizado.
Nota
Una clase que hereda de Control administra enlaces automáticamente mediante la propiedad BindingContext, de modo que es bastante raro que se den casos en que tenga que implementar ICurrencyManagerProvider.
Vea también
Tareas
Cómo: Crear un control con enlace simple en un formulario Windows Forms
Conceptos
Enlace de datos y formularios Windows Forms