Compartilhar via


Arquitetura do componente BindingSource

Com o componente BindingSource, você pode associar universalmente todos os controles do Windows Forms a fontes de dados.

O componente BindingSource simplifica o processo de associação de controles a uma fonte de dados e fornece as seguintes vantagens em relação à associação de dados tradicional:

  • Habilita a associação a objetos comerciais em tempo de design.

  • Encapsula a funcionalidade CurrencyManager e expõe os eventos CurrencyManager em tempo de design.

  • Simplifica a criação de uma lista que dá suporte à interface IBindingList fornecendo notificação de alteração de lista para fontes de dados que não dão suporte nativo à notificação de alteração de lista.

  • Fornece um ponto de extensibilidade para o método IBindingList.AddNew.

  • Fornece um nível de indireção entre a fonte de dados e o controle. Este indirecionamento é importante quando a fonte de dados pode ser alterada durante o tempo de execução.

  • Interopera com outros controles do Windows Forms relacionados a dados, especificamente o BindingNavigator e os controles DataGridView.

Por esses motivos, o componente BindingSource é a maneira preferida de associar seus controles do Windows Forms a fontes de dados.

Recursos de BindingSource

O componente BindingSource fornece vários recursos para associar controles aos dados. Com esses recursos, você pode implementar a maioria dos cenários de associação de dados sem quase nenhuma codificação de sua parte.

O componente BindingSource faz isso fornecendo uma interface consistente para acessar muitos tipos diferentes de fontes de dados. Isso significa que você usa o mesmo procedimento para associar a qualquer tipo. Por exemplo, você pode anexar a propriedade DataSource a um DataSet ou a um objeto de negócios e, em ambos os casos, usar o mesmo conjunto de propriedades, métodos e eventos para manipular a fonte de dados.

A interface consistente fornecida pelo componente BindingSource simplifica muito o processo de associação de dados aos controles. Para tipos de fonte de dados que fornecem notificação de alteração, o componente BindingSource comunica automaticamente as alterações entre o controle e a fonte de dados. Para tipos de fonte de dados que não fornecem notificação de alteração, são fornecidos eventos que permitem gerar notificações de alteração. A lista a seguir mostra os recursos compatíveis com o componente BindingSource:

Indireção

O componente BindingSource fornece um nível de indireção entre um controle e uma fonte de dados. Em vez de associar um controle diretamente a uma fonte de dados, você associa o controle a uma BindingSourcee anexa a fonte de dados à propriedade DataSource do componente BindingSource.

Com esse nível de indireção, você pode alterar a fonte de dados sem redefinir a associação de controle. Isso oferece os seguintes recursos:

Gerenciamento de Moeda

O componente BindingSource implementa a interface ICurrencyManagerProvider para lidar com o gerenciamento de moeda para você. Com a interface ICurrencyManagerProvider, você também pode acessar o gerenciador de moedas para um BindingSource, além do gerenciador de moedas para outro BindingSource associado ao mesmo DataMember.

O componente BindingSource encapsula a funcionalidade CurrencyManager e expõe as propriedades e os eventos mais comuns de CurrencyManager. A tabela a seguir descreve alguns dos membros relacionados ao gerenciamento de moeda.

Propriedade CurrencyManager
Obtém o gerenciador de moeda associado ao BindingSource.

método GetRelatedCurrencyManager
Se houver outro BindingSource associado ao membro de dados especificado, obterá gerenciador de moedas correspondente.

Propriedade Current
Obtém o item atual da fonte de dados.

Propriedade Position
Obtém ou define a posição atual na lista subjacente.

método EndEdit
Aplica alterações pendentes à fonte de dados subjacente.

método CancelEdit
Cancela a operação de edição atual.

Fonte de dados como uma lista

O componente BindingSource implementa as interfaces IBindingListView e ITypedList. Com essa implementação, você pode usar o próprio componente BindingSource como fonte de dados, sem nenhum armazenamento externo.

Quando o componente BindingSource é anexado a uma fonte de dados, ele expõe a fonte de dados como uma lista.

A propriedade DataSource pode ser configurada para várias fontes de dados. Isso inclui tipos, objetos e listas de tipos. A fonte de dados resultante será exposta como uma lista. A tabela a seguir mostra algumas das fontes de dados comuns e a avaliação da lista resultante.

Propriedade DataSource Listar resultados
Uma referência nula (Nothing no Visual Basic) Uma IBindingList de objetos vazia. Adicionar um item define a lista para o tipo do item adicionado.
Uma referência nula (Nothing no Visual Basic) com DataMember definido Sem suporte; gera uma ArgumentException.
Tipo ou objeto não de lista do tipo "T" Uma IBindingList vazia do tipo "T".
Instância de matriz Um IBindingList que contém os elementos da matriz.
Instância de IEnumerable Um IBindingList que contém os itens de IEnumerable
Listar instância que contém o tipo "T" Uma instância de IBindingList que contém o tipo "T".

Além disso, DataSource podem ser definidos para outros tipos de lista, como IListSource e ITypedList, e o BindingSource os manipulará adequadamente. Nesse caso, o tipo contido na lista deve ter um construtor sem parâmetros.

BindingSource como uma IBindingList

O componente BindingSource fornece membros para acessar e manipular os dados subjacentes como se fosse um IBindingList. A tabela a seguir descreve alguns desses membros.

Membro Descrição
Propriedade List Obtém a lista resultante da avaliação das propriedades de DataSource ou DataMember.
método AddNew Adiciona um novo item à lista subjacente. Aplica-se a fontes de dados que implementam a interface IBindingList e permitem a adição de itens (ou seja, a propriedade AllowNew é definida como true).

Criação de item personalizado

Você pode lidar com o evento AddingNew para fornecer sua própria lógica de criação de item. O evento AddingNew ocorre antes de um novo objeto ser adicionado ao BindingSource. Esse evento é gerado depois que o método AddNew é chamado, mas antes que o novo item seja adicionado à lista subjacente. Ao lidar com esse evento, você pode fornecer um comportamento de criação de item personalizado sem derivar da classe BindingSource. Para obter mais informações, confira Como personalizar a adição de item com o BindingSource do Windows Forms.

Criação de item transacional

O componente BindingSource implementa a interface ICancelAddNew, que permite a criação de item transacional. Depois que um novo item for criado provisoriamente usando uma chamada para AddNew, a adição poderá ser confirmada ou revertida das seguintes maneiras:

  • O método EndNew confirmará explicitamente a adição pendente.

  • Executar outra operação de coleção, como uma inserção, remoção ou movimentação, confirmará implicitamente a adição pendente.

  • O método CancelNew reverterá a adição pendente se o método ainda não tiver sido confirmado.

Suporte a IEnumerable

O componente BindingSource permite a associação de controles a fontes de dados IEnumerable. Com esse componente, você pode associar a uma fonte de dados, como um System.Data.SqlClient.SqlDataReader.

Quando uma fonte de dados IEnumerable é atribuída ao componente BindingSource, o BindingSource cria um IBindingList e adiciona o conteúdo da fonte de dados IEnumerable à lista.

Suporte a tempo de design

Alguns tipos de objeto não podem ser criados em tempo de design, como objetos criados a partir de uma classe de fábrica ou objetos retornados por um serviço Web. Às vezes, você pode ter que associar seus controles a esses tipos em tempo de design, mesmo que não haja nenhum objeto na memória ao qual seus controles possam ser associados. Você pode, por exemplo, precisar rotular os cabeçalhos de coluna de um controle DataGridView com os nomes das propriedades públicas do tipo personalizado.

Para dar suporte a esse cenário, o componente BindingSource dá suporte à associação a um Type. Quando você atribui um Type à propriedade DataSource, o componente BindingSource cria uma BindingList<T> vazia contendo itens de Type. Todos os controles que você associar posteriormente ao componente BindingSource serão notificados sobre a presença das propriedades ou do esquema do seu tipo em tempo de design ou execução. Para obter mais informações, consulte Como associar um controle dos Windows Forms a um tipo.

Métodos ListBindingHelper estáticos

Os tipos System.Windows.Forms.BindingContext, System.Windows.Forms.CurrencyManagere BindingSource compartilham lógica comum para gerar uma lista de um par DataSource/DataMember. Além disso, essa lógica comum é publicamente exposta para ser usada por autores de controle e terceiros nos seguintes métodos static:

Classificação e filtragem com a interface IBindingListView

O componente BindingSource implementa a interface IBindingListView, que estende a interface IBindingList. O IBindingList oferece classificação de coluna única e o IBindingListView oferece classificação e filtragem avançadas. Com IBindingListView, você poderá classificar e filtrar itens na fonte de dados, se a fonte de dados também implementar uma dessas interfaces. O componente BindingSource não fornece uma implementação de referência desses membros. Em vez disso, as chamadas são encaminhadas para a lista subjacente.

A tabela a seguir descreve as propriedades usadas para classificação e filtragem.

Membro Descrição
Propriedade Filter Se a fonte de dados for um IBindingListView, obtém ou define a expressão usada para filtrar quais linhas são exibidas.
Propriedade Sort Se a fonte de dados for um IBindingList, obtém ou define um nome de coluna usado para ordenar os dados, bem como informações sobre a ordem de classificação.

- ou -

Se a fonte de dados é uma IBindingListView e dá suporte à classificação avançada, obtém vários nomes de colunas usados para classificação e a ordem de classificação

Integração com BindingNavigator

Você pode usar o componente BindingSource para associar qualquer controle do Windows Forms a uma fonte de dados, mas o controle BindingNavigator foi projetado especificamente para trabalhar com o componente BindingSource. O controle BindingNavigator fornece uma interface do usuário para controlar o item atual do componente BindingSource. Por padrão, o controle BindingNavigator fornece botões que correspondem aos métodos de navegação no componente BindingSource. Para obter mais informações, consulte Como navegar em dados com o controle BindingNavigator dos Windows Forms.

Consulte também