Partilhar via


Visão geral da vinculação de dados com o Windows Forms

No Windows Forms, você pode vincular não apenas fontes de dados tradicionais, mas também a praticamente qualquer estrutura que contenha dados. Você pode vincular a uma matriz de valores que você calcula em tempo de execução, ler de um arquivo ou derivar dos valores de outros controles.

Além disso, você pode vincular qualquer propriedade de qualquer controle à fonte de dados. Na associação de dados tradicional, você normalmente vincula a propriedade display — por exemplo, a propriedade Text de um controle TextBox — à fonte de dados. Com o .NET, você também tem a opção de definir outras propriedades por meio da vinculação. Você pode usar a associação para executar as seguintes tarefas:

  • Definindo o gráfico de um controle de imagem.

  • Definir a cor de fundo de um ou mais controlos.

  • Definindo o tamanho dos controles.

Essencialmente, a vinculação de dados é uma maneira automática de definir qualquer propriedade acessível em tempo de execução de qualquer controle em um formulário.

ADO.NET permite criar muitas estruturas de dados diferentes para atender às necessidades de vinculação do seu aplicativo e dos dados com os quais você está trabalhando. Talvez você queira criar suas próprias classes que fornecem ou consomem dados no Windows Forms. Esses objetos podem oferecer diferentes níveis de funcionalidade e complexidade. Desde a vinculação básica de dados até o fornecimento de suporte em tempo de design, verificação de erros, notificação de alteração ou até mesmo suporte para uma reversão estruturada das alterações feitas nos próprios dados.

Consumidores de interfaces de ligação de dados

As seções a seguir descrevem dois grupos de objetos de interface. O primeiro grupo de interface é implementado nas fontes de dados pelos autores das fontes de dados. Os consumidores da fonte de dados, como os controles ou componentes do Windows Forms, implementam essas interfaces. O segundo grupo de interface é projetado para uso por autores de componentes. Os autores de componentes usam essas interfaces quando estão criando um componente que oferece suporte à vinculação de dados a ser consumida pelo mecanismo de vinculação de dados do Windows Forms. Você pode implementar essas interfaces dentro de classes associadas ao seu formulário para habilitar a vinculação de dados. Cada caso apresenta uma classe que implementa uma interface que permite a interação com os dados. As ferramentas de experiência de design de dados de desenvolvimento rápido de aplicativos (RAD) do Visual Studio já aproveitam essa funcionalidade.

Interfaces para implementação por autores de fontes de dados

Os controles Windows Forms implementam as seguintes interfaces:

  • IList Interface

    Uma classe que implementa a interface IList pode ser um Array, ArrayListou CollectionBase. Estas são listas indexadas de itens do tipo Object e as listas devem conter tipos homogêneos, porque o primeiro item do índice determina o tipo. IList estaria disponível para vinculação apenas em tempo de execução.

    Observação

    Se você quiser criar uma lista de objetos de negócios para associação com o Windows Forms, você deve considerar o uso do BindingList<T>. O BindingList é uma classe extensível que implementa as interfaces primárias necessárias para a associação de dados bidirecional do Windows Forms.

  • IBindingList Interface

    Uma classe que implementa a interface IBindingList fornece um nível muito maior de funcionalidade de vinculação de dados. Essa implementação oferece recursos básicos de classificação e notificação de alterações. Ambos são úteis quando os itens da lista mudam e quando a própria lista muda. A notificação de alteração é importante se você planeja ter vários controles vinculados aos mesmos dados. Ele ajuda você a fazer alterações de dados feitas em um dos controles para propagar para os outros controles acoplados.

    Observação

    A notificação de alteração é habilitada para a interface IBindingList por meio da propriedade SupportsChangeNotification que, quando true, gera um evento ListChanged, indicando a lista alterada ou um item na lista alterado.

    O tipo de alteração é descrito pela propriedade ListChangedType do parâmetro ListChangedEventArgs. Assim, sempre que o modelo de dados for atualizado, quaisquer exibições dependentes, como outros controles vinculados à mesma fonte de dados, também serão atualizadas. No entanto, os objetos contidos na lista terão que notificar a lista quando forem alterados para que a lista possa gerar o ListChanged evento.

    Observação

    O BindingList<T> fornece uma implementação genérica da interface IBindingList.

  • IBindingListView Interface

    Uma classe que implementa a interface IBindingListView fornece toda a funcionalidade de uma implementação de IBindingList, juntamente com filtragem e funcionalidade de classificação avançada. Essa implementação oferece filtragem baseada em texto e classificação de várias colunas com pares de descritor de propriedade e direção.

  • IEditableObject Interface

    Uma classe que implementa a interface IEditableObject permite que um objeto controle quando as alterações nesse objeto são tornadas permanentes. Essa implementação oferece suporte aos métodos BeginEdit, EndEdite CancelEdit, que permitem reverter as alterações feitas no objeto. A seguir está uma breve explicação do funcionamento dos métodos BeginEdit, EndEdite CancelEdit e como eles funcionam uns com os outros para permitir uma possível reversão das alterações feitas nos dados:

    • O método BeginEdit sinaliza o início de uma edição em um objeto. Um objeto que implementa essa interface precisará armazenar todas as atualizações após a chamada do método BeginEdit de tal forma que as atualizações possam ser descartadas se o método CancelEdit for chamado. Nos Windows Forms de associação de dados, você pode chamar BeginEdit várias vezes dentro do escopo de uma única transação de edição (por exemplo, BeginEdit, BeginEdit, EndEdit). As implementações de IEditableObject devem acompanhar se BeginEdit já foi chamado e devem ignorar chamadas subsequentes para BeginEdit. Como esse método pode ser chamado várias vezes, é importante que as chamadas subsequentes para ele não sejam destrutivas. As chamadas BeginEdit subsequentes não podem destruir as atualizações que foram feitas ou alterar os dados que foram salvos na primeira chamada BeginEdit.

    • O método EndEdit propaga quaisquer alterações desde que BeginEdit tenha sido chamado; no objeto subjacente, se o objeto está em modo de edição.

    • O método CancelEdit descarta todas as alterações feitas no objeto.

    Para obter mais informações sobre como os métodos BeginEdit, EndEdite CancelEdit funcionam, consulte Salvar dados de volta ao banco de dados.

    Essa noção transacional de funcionalidade de dados é usada pelo controle DataGridView.

  • ICancelAddNew Interface

    Uma classe que implementa a interface ICancelAddNew geralmente implementa a interface IBindingList e permite reverter uma adição feita à fonte de dados com o método AddNew. Se sua fonte de dados implementa a interface IBindingList, você também deve fazê-la implementar a interface ICancelAddNew.

  • IDataErrorInfo Interface

    Uma classe que implementa a interface IDataErrorInfo permite que os objetos ofereçam informações de erro personalizadas para controles acoplados:

    • A propriedade Error retorna o texto da mensagem de erro geral (por exemplo, "Ocorreu um erro").

    • A propriedade Item[] retorna uma cadeia de caracteres com a mensagem de erro específica da coluna (por exemplo, "O valor na coluna State é inválido").

  • IEnumerable Interface

    Uma classe que implementa a interface IEnumerable normalmente é consumida por ASP.NET. O suporte do Windows Forms para esta interface só está disponível através do componente BindingSource.

    Observação

    O componente BindingSource copia todos os itens IEnumerable em uma lista separada para fins de vinculação.

  • ITypedList Interface

    Uma classe de coleções que implementa a interface ITypedList fornece o recurso para controlar a ordem e o conjunto de propriedades expostas ao controle associado.

    Observação

    Quando você implementa o método GetItemProperties e a matriz PropertyDescriptor não é nula, a última entrada na matriz será o descritor de propriedade que descreve a propriedade list que é outra lista de itens.

  • ICustomTypeDescriptor Interface

    Uma classe que implementa a interface ICustomTypeDescriptor fornece informações dinâmicas sobre si mesma. Esta interface é semelhante ao ITypedList mas é usada para objetos em vez de listas. Essa interface é usada por DataRowView para projetar o esquema das linhas subjacentes. Uma implementação simples de ICustomTypeDescriptor é fornecida pela classe CustomTypeDescriptor.

    Observação

    Para dar suporte à vinculação em tempo de design para tipos que implementam ICustomTypeDescriptor, o tipo também deve implementar IComponent e existir como uma instância no Formulário.

  • IListSource Interface

    Uma classe que implementa a interface IListSource permite a vinculação baseada em lista em objetos que não são de lista. O método GetList de IListSource é usado para retornar uma lista vinculável de um objeto que não herda de IList. IListSource é usado pela classe DataSet.

  • IRaiseItemChangedEvents Interface

    Uma classe que implementa a interface IRaiseItemChangedEvents é uma lista vinculável que também implementa a interface IBindingList. Essa interface é usada para indicar se seu tipo gera ListChanged eventos do tipo ItemChanged por meio de sua propriedade RaisesItemChangedEvents.

    Observação

    Você deve implementar o IRaiseItemChangedEvents se a sua fonte de dados fornecer a propriedade para listar a conversão de eventos descrita anteriormente e estiver interagindo com o componente BindingSource. Caso contrário, o BindingSource também executará a conversão de propriedades em eventos de lista, resultando num desempenho mais lento.

  • ISupportInitialize Interface

    Um componente que implementa a interface ISupportInitialize aproveita as otimizações em lote para definir propriedades e inicializar propriedades codependentes. O ISupportInitialize contém dois métodos:

    • BeginInit sinaliza que a inicialização do objeto está começando.

    • EndInit sinaliza que a inicialização do objeto está terminando.

  • ISupportInitializeNotification Interface

    Um componente que implementa a interface ISupportInitializeNotification também implementa a interface ISupportInitialize. Essa interface permite que você notifique outros componentes ISupportInitialize que a inicialização foi concluída. A interface ISupportInitializeNotification contém dois membros:

  • INotifyPropertyChanged Interface

    Uma classe que implementa essa interface é um tipo que gera um evento quando qualquer um de seus valores de propriedade muda. Essa interface foi projetada para substituir o padrão de ter um evento de alteração para cada propriedade de um controle. Quando usado em um BindingList<T>, um objeto de negócios deve implementar a interface INotifyPropertyChanged e BindingList'1 converterá PropertyChanged eventos em eventos ListChanged do tipo ItemChanged.

    Observação

    Para que a notificação de alteração ocorra numa ligação entre um cliente associado e uma fonte de dados, o seu tipo de fonte de dados associado deve implementar a interface INotifyPropertyChanged (preferencial) ou pode-se fornecer eventos propertyNameChanged para o tipo associado, mas não deve fazer ambas.

Interfaces para implementação por autores de componentes

As interfaces a seguir são projetadas para consumo pelo mecanismo de vinculação de dados do Windows Forms:

  • IBindableComponent Interface

    Uma classe que implementa essa interface é um componente sem controle que oferece suporte à vinculação de dados. Essa classe retorna as associações de dados e o contexto de ligação do componente por meio das propriedades DataBindings e BindingContext dessa interface.

    Observação

    Se o componente herdar de Control, você não precisará implementar a interface IBindableComponent.

  • ICurrencyManagerProvider Interface

    Uma classe que implementa a interface ICurrencyManagerProvider é um componente que fornece sua própria CurrencyManager para gerenciar as ligações associadas a esse componente específico. O acesso ao CurrencyManager personalizado é fornecido pela propriedade CurrencyManager.

    Observação

    Uma classe que herda de Control gerencia associações automaticamente por meio de sua propriedade BindingContext, portanto, os casos em que você precisa implementar o ICurrencyManagerProvider são bastante raros.

Fontes de dados suportadas pelo Windows Forms

Tradicionalmente, a vinculação de dados tem sido usada dentro de aplicativos para aproveitar os dados armazenados em bancos de dados. Com a associação de dados do Windows Forms, você pode acessar dados de bancos de dados e dados em outras estruturas, como matrizes e coleções, desde que certos requisitos mínimos tenham sido atendidos.

Estruturas para vincular

No Windows Forms, você pode vincular a uma ampla variedade de estruturas, desde objetos simples (vinculação simples) até listas complexas, como tabelas de dados ADO.NET (vinculação complexa). Para ligações simples, o Windows Forms oferece suporte à vinculação às propriedades públicas do simples objeto. A associação baseada em lista do Windows Forms geralmente requer que o objeto ofereça suporte à interface IList ou à interface IListSource. Além disso, se você estiver vinculando por meio de um componente BindingSource, poderá vincular a um objeto que ofereça suporte à interface IEnumerable.

A lista a seguir mostra as estruturas às quais você pode se vincular no Windows Forms.

  • BindingSource

    Um BindingSource é a fonte de dados mais comum do Windows Forms e atua como proxy entre uma fonte de dados e os controles do Windows Forms. O padrão geral de uso BindingSource é vincular seus controles ao BindingSource e vincular o BindingSource à fonte de dados (por exemplo, uma tabela de dados ADO.NET ou um objeto comercial). O BindingSource fornece serviços que permitem e melhoram o nível de suporte à vinculação de dados. Por exemplo, os controles baseados em lista do Windows Forms, como o DataGridView e o ComboBox, não oferecem suporte direto à vinculação a fontes de dados IEnumerable, no entanto, você pode habilitar esse cenário vinculando por meio de um BindingSource. Nesse caso, o BindingSource converterá a fonte de dados em um IList.

  • Objetos simples

    O Windows Forms oferece suporte a propriedades de controle de vinculação de dados a propriedades públicas na instância de um objeto usando o tipo Binding. Os Windows Forms também oferecem suporte a controles de lista com vinculação, como um ListControl a uma instância de objeto quando um BindingSource é usado.

  • Matriz ou coleção

    Para atuar como uma fonte de dados, uma lista deve implementar a interface IList; Um exemplo seria uma matriz que é uma instância da classe Array. Para obter mais informações sobre matrizes, consulte Como criar uma matriz de objetos (Visual Basic).

    Em geral, você deve usar BindingList<T> ao criar listas de objetos para vinculação de dados. BindingList é uma versão genérica da interface IBindingList. A interface IBindingList estende a interface IList adicionando propriedades, métodos e eventos necessários para a vinculação de dados bidirecional.

  • IEnumerable

    Os controles do Windows Forms podem ser vinculados a fontes de dados que só oferecem suporte à interface IEnumerable se estiverem vinculados por meio de um componente BindingSource.

  • ADO.NET objetos de dados

    ADO.NET fornece muitas estruturas de dados adequadas para vinculação. Cada um varia em sua sofisticação e complexidade.

    • DataColumn

      Um DataColumn é o bloco de construção essencial de um DataTable, na medida em que várias colunas compõem uma tabela. Cada DataColumn tem uma propriedade DataType que determina o tipo de dados que a coluna contém (por exemplo, a marca de um automóvel em uma tabela que descreve carros). Você pode vincular um controle (como a propriedade TextBox de um controle Text) a uma coluna dentro de uma tabela de dados.

    • DataTable

      Um DataTable é a representação de uma tabela, com linhas e colunas, em ADO.NET. Uma tabela de dados contém duas coleções: DataColumn, representando as colunas de dados em uma determinada tabela (que, em última análise, determinam os tipos de dados que podem ser inseridos nessa tabela) e DataRow, representando as linhas de dados em uma determinada tabela. Você pode vincular um controle às informações contidas em uma tabela de dados (como vincular o controle DataGridView a uma tabela de dados). No entanto, quando você vincula a um DataTable, você vincula o modo de exibição padrão da tabela.

    • DataView

      Um DataView é uma exibição personalizada de uma única tabela de dados que pode ser filtrada ou classificada. Uma vista de dados é o "instantâneo" de dados usado por controles vinculados a dados complexos. Você pode vincular de forma simples ou complexa aos dados dentro de uma exibição de dados, mas observe que está vinculando a uma "imagem" fixa dos dados em vez de uma fonte de dados limpa e atualizada.

    • DataSet

      Um DataSet é uma coleção de tabelas, relações e restrições dos dados em um banco de dados. Você pode realizar uma ligação simples ou complexa aos dados dentro de um conjunto de dados, mas note que a ligação está a ser feita ao DataViewManager padrão para o DataSet (consulte o próximo ponto).

    • DataViewManager

      Um DataViewManager é uma visão personalizada de toda a DataSet, análoga a um DataView, mas com relações incluídas. Com uma coleção DataViewSettings, você pode definir filtros padrão e opções de classificação para quaisquer modos de exibição que o DataViewManager tenha para uma determinada tabela.

Tipos de vinculação de dados

O Windows Forms pode tirar proveito de dois tipos de vinculação de dados: vinculação simples e vinculação complexa. Cada um oferece vantagens diferentes.

Tipo de ligação de dados Descrição
Vinculação de dados simples A capacidade de um controle de vincular a um único elemento de dados, como um valor em uma coluna em uma tabela de conjunto de dados. A vinculação de dados simples é o tipo de associação típico para controles como um controle TextBox ou um controle Label, que são controles que normalmente exibem apenas um único valor. Na verdade, qualquer propriedade em um controle pode ser vinculada a um campo em um banco de dados. Há suporte extensivo para esse recurso no Visual Studio.

Para obter mais informações, consulte Navegar nos dados e Criar um controlo simples vinculado (Windows Forms .NET).
Vinculação de dados complexa A capacidade de um controle de se vincular a mais de um elemento de dados, normalmente mais de um registro em um banco de dados. A vinculação complexa também é chamada de vinculação baseada em lista. Exemplos de controles que oferecem suporte a vinculação complexa são os controles DataGridView, ListBoxe ComboBox. Para obter um exemplo de associação de dados complexa, consulte Como vincular um controle ComboBox ou ListBox do Windows Forms a dados.

Componente de origem da ligação

Para simplificar a associação de dados, o Windows Forms permite vincular uma fonte de dados ao componente BindingSource e, em seguida, vincular controles ao BindingSource. Você pode usar o BindingSource em cenários de vinculação simples ou complexos. Em ambos os casos, o BindingSource atua como intermediário entre a fonte de dados e os controles vinculados, fornecendo notificação de alteração, gerenciamento de moeda e outros serviços.

Cenários comuns que empregam a vinculação de dados

Quase todas as aplicações comerciais utilizam informações lidas a partir de fontes de dados de um tipo ou de outro, geralmente através da ligação de dados. A lista a seguir mostra alguns dos cenários mais comuns que utilizam a vinculação de dados como o método de apresentação e manipulação de dados.

Cenário Descrição
Elaboração de Relatórios Os relatórios fornecem uma maneira flexível de exibir e resumir seus dados em um documento impresso. É comum criar um relatório que imprime o conteúdo selecionado de uma fonte de dados na tela ou em uma impressora. Os relatórios comuns incluem listas, faturas e resumos. Os itens são formatados em colunas de listas, com subitens organizados em cada item de lista, mas você deve escolher o layout que melhor se adapta aos dados.
Introdução de dados Uma maneira comum de inserir grandes quantidades de dados relacionados ou solicitar informações aos usuários é por meio de um formulário de entrada de dados. Os usuários podem inserir informações ou selecionar opções usando caixas de texto, botões de opção, listas suspensas e caixas de seleção. As informações são então enviadas e armazenadas numa base de dados, cuja estrutura se baseia nas informações introduzidas.
Relação mestre/detalhe Um aplicativo mestre/detalhado é um formato para examinar dados relacionados. Especificamente, existem duas tabelas de dados com uma relação conectando no exemplo comercial clássico, uma tabela "Clientes" e uma tabela "Pedidos" com uma relação entre eles vinculando clientes e seus respetivos pedidos. Para obter mais informações sobre como criar um aplicativo mestre/detalhe com dois controles Windows Forms DataGridView , consulte Como criar um formulário mestre/detalhado usando dois controles DataGridView do Windows Forms.
Tabela de consulta Outro cenário comum de apresentação/manipulação de dados é a consulta de tabela. Muitas vezes, como parte de uma exibição de dados maior, um controle de ComboBox é usado para exibir e manipular dados. A chave é que os dados exibidos no controle ComboBox são diferentes dos dados gravados no banco de dados. Por exemplo, se você tiver um controle de ComboBox exibindo os itens disponíveis em uma mercearia, provavelmente gostaria de ver os nomes dos produtos (pão, leite, ovos). No entanto, para facilitar a recuperação de informações dentro do banco de dados e para a normalização do banco de dados, você provavelmente armazenaria as informações para os itens específicos de uma determinada ordem como números de item (#501, #603 e assim por diante). Assim, há uma conexão implícita entre o "nome amigável" do item de supermercado no controlo ComboBox no seu formulário e o número de item relacionado que está presente num pedido. É a essência de uma consulta de tabela. Para obter mais informações, consulte Como criar uma tabela de pesquisa com o componente BindingSource do Windows Forms.

Ver também