Interfaces relacionadas con el enlace de datos

Con ADO.NET, puede 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 varios 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 datos.

Consumidores de interfaces de enlace de datos

En las secciones siguientes se describen dos grupos de objetos de interfaz. El primer grupo muestra las interfaces que los autores de orígenes de datos implementan en los orígenes de datos. Estas interfaces están diseñadas para que los consumidores de orígenes de datos las usen, los que en muchos casos son controles o componentes de Windows Forms. En el segundo grupo se muestran interfaces diseñadas para su uso por parte de los autores de 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 con el formulario para habilitar el enlace de datos; en cada caso se presenta una clase que implementa una interfaz que permite interactuar 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

Las interfaces siguientes están diseñadas para ser usadas por los controles de Windows Forms:

  • 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. Estas listas deben contener tipos homogéneos, porque 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<T> 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. La implementación ofrece funcionalidades de ordenación y notificación de cambios, ambas para cuando los elementos de la lista cambian (por ejemplo, el tercer elemento de una lista de clientes tiene un cambio en el campo Address), así como cuando cambia la lista misma (por ejemplo, si el número de elementos de la lista aumenta o disminuye). La notificación de cambios es importante si planea tener varios controles enlazados a los mismos datos y desea que los cambios de datos que se hacen en uno de los controles se propague 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, así como 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 ofrece 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 en conjunto 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. Como este método se puede llamar varias veces, es importante que las llamadas subsiguientes que reciba no sean destructivas; es decir, las llamadas subsiguientes a BeginEdit no pueden destruir las actualizaciones hechas ni cambiar los datos que se guardaron 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 capacidad de 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:

Vea también