Compartilhar via


Visão geral da vinculação de dados (Windows Forms .NET)

No Windows Forms, você pode vincular não apenas a 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 no tempo de execução, lê de um arquivo ou deriva dos valores de outros controles.

Além disso, você pode vincular qualquer propriedade de qualquer controle à fonte de dados. Na vinculação de dados tradicional, você geralmente vincula a propriedade de exibição — 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 associação. É possível usar a vinculação para realizar as seguintes tarefas:

  • Definir o grafo de um controle de imagem.

  • Definir a cor do plano de fundo de um ou mais controles.

  • Definir o tamanho dos controles.

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

ADO.NET permite que você crie muitas estruturas de dados diferentes para atender às necessidades de vinculação de 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 níveis variados de funcionalidade e complexidade. Desde a vinculação de dados básicos até o fornecimento de suporte em tempo de design, verificação de erros, notificação de alterações ou até mesmo suporte para uma reversão estruturada das alterações feitas nos próprios dados.

Consumidores de interfaces de vinculação de dados

As seções a seguir descrevem dois grupos de objetos de interface. O primeiro grupo de interface é implementado em fontes de dados pelos autores da fonte 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 do Visual Studio RAD, desenvolvimento rápido de aplicativos, já aproveitam essa funcionalidade.

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

Os controles do Windows Forms implementam as seguintes interfaces:

  • IList interface

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

    Observação

    Se você quiser criar uma lista de objetos comerciais para associação com o Windows Forms, considere 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 IBindingList interface fornece um nível muito mais alto 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 são alterados e quando a própria lista é alterada. 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 vinculados.

    Observação

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

    O tipo de alteração é descrito pela ListChangedType propriedade do ListChangedEventArgs parâmetro. Portanto, sempre que o modelo de dados for atualizado, quaisquer exibições dependentes, como outros controles associados à 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 IBindingList interface.

  • IBindingListView interface

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

  • IEditableObject interface

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

    • O BeginEdit método 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 de método de BeginEdit tal forma que as atualizações possam ser descartadas se o CancelEdit método for chamado. Na vinculação de dados do Windows Forms, você pode chamar BeginEdit várias vezes dentro do escopo de uma única transação de edição (por exemplo, , , BeginEditBeginEditEndEdit). As implementações de IEditableObject devem acompanhar se BeginEdit já foi chamado e 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 subsequentes BeginEdit não podem destruir as atualizações que foram feitas ou alterar os dados que foram salvos na primeira BeginEdit chamada.

    • O EndEdit método envia por push todas as alterações desde que BeginEdit foi chamado para o objeto subjacente, se o objeto estiver atualmente no modo de edição.

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

    Para obter mais informações sobre como os BeginEditmétodos , e e CancelEdit funcionam, EndEditconsulte Salvar dados de volta ao banco de dados.

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

  • ICancelAddNew interface

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

  • IDataErrorInfo interface

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

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

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

  • IEnumerable interface

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

    Observação

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

  • ITypedList interface

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

    Observação

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

  • ICustomTypeDescriptor interface

    Uma classe que implementa a ICustomTypeDescriptor interface fornece informações dinâmicas sobre si mesma. Essa interface é semelhante, 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 CustomTypeDescriptor classe.

    Observação

    Para oferecer 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 habilita a IListSource vinculação baseada em lista em objetos que não são da lista. O GetList método de é usado para retornar uma lista vinculável de IListSource um objeto que não herda do IList.IListSource é usado pela DataSet classe.

  • IRaiseItemChangedEvents interface

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

    Observação

    Você deve implementar o if sua fonte de dados fornece a propriedade para listar a conversão de eventos descrita anteriormente e está interagindo com o IRaiseItemChangedEventsBindingSource componente. Caso contrário, o BindingSource também executará a propriedade para listar a conversão de eventos, resultando em um desempenho mais lento.

  • ISupportInitialize interface

    Um componente que implementa a ISupportInitialize interface aproveita as vantagens das 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á sendo iniciada.

    • EndInit sinaliza que a inicialização do objeto está sendo concluída.

  • ISupportInitializeNotification interface

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

  • INotifyPropertyChanged interface

    Uma classe que implementa essa interface é um tipo que aciona um evento quando qualquer um dos seus valores de propriedade são alterados. 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 , um BindingList<T>objeto de negócios deve implementar a INotifyPropertyChanged interface e o BindingList'1 converterá PropertyChanged eventos em ListChanged eventos do tipo ItemChanged.

    Observação

    Para que a notificação de alteração ocorra em uma associação entre um cliente vinculado e uma fonte de dados, seu tipo de fonte de dados vinculado deve implementar a INotifyPropertyChanged interface (preferencial) ou você pode fornecer eventos propertyNameChanged para o tipo vinculado, mas não deve fazer as duas coisas.

Interfaces para implementação por autores de componentes

As seguintes interfaces são projetadas para consumo pelo mecanismo de associação de dados dos Windows Forms:

Fontes de dados suportadas pelo Windows Forms

Tradicionalmente, a associação de dados era usada nos aplicativos para tirar proveito dos dados armazenados em bancos de dados. Com a vinculaçã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 determinados requisitos mínimos tenham sido atendidos.

Estruturas a serem vinculadas

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

A lista a seguir mostra as estruturas a que você pode associar no Windows Forms.

  • BindingSource

    A BindingSource é a fonte de dados mais comum do Windows Forms e atua como um proxy entre uma fonte de dados e controles do Windows Forms. O padrão de uso geral BindingSource é vincular seus controles à fonte de dados e vinculá-la BindingSource à BindingSource fonte de dados (por exemplo, uma tabela de dados ADO.NET ou um objeto comercial). O BindingSource fornece serviços que habilitam e melhoram o nível de suporte à vinculação de dados. Por exemplo, controles baseados em lista do Windows Forms, como o DataGridView e ComboBox não oferecem suporte direto à vinculação a IEnumerable fontes de dados, 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 IListarquivo .

  • 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 Binding tipo. O Windows Forms também oferece suporte a controles baseados em lista de vinculação, como uma ListControl instância de objeto quando um BindingSource é usado.

  • Matriz ou Coleção

    Para atuar como uma fonte de dados, uma lista deve implementar a IList interface, um exemplo seria uma matriz que é uma instância da Array classe. 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 associação de dados. BindingList é uma versão genérica da IBindingList interface. A IBindingList interface estende a interface adicionando propriedades, métodos e eventos necessários para a IList vinculação de dados bidirecional.

  • IEnumerable

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

  • ADO.NET objetos de dados

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

    • DataColumn

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

    • DataTable

      A 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 DataGridView controle a uma tabela de dados). No entanto, quando você se vincula a um DataTable, você é uma associação ao modo de exibição padrão da tabela.

    • DataView

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

    • DataSet

      A DataSet é uma coleção de tabelas, relacionamentos e restrições dos dados em um banco de dados. Você pode vincular de forma simples ou complexa aos dados dentro de um conjunto de dados, mas observe que você está vinculando ao padrão DataViewManager para o (consulte o DataSet próximo marcador).

    • DataViewManager

      A DataViewManager é uma visão personalizada do todo DataSet, análoga a a DataView, mas com relações incluídas. Com uma coleção, você pode definir filtros padrão e opções de classificação para qualquer modo de exibição que o DataViewManager tem para uma DataViewSettings 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 uma oferece vantagens diferentes.

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

Para obter mais informações, consulte Navegar em dados e Criar um controle de associação simples (Windows Forms .NET).
Vinculação de dados complexos A capacidade de um controle para vincular a mais de um elemento de dados, geralmente 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 suportam vinculação complexa são os controles DataGridView, ListBox e 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 de vinculação

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

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

Praticamente todos os aplicativos comerciais usam leitura de informações de fontes de dados de um tipo ou de outro, normalmente por meio da vinculaçã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 de dados e a manipulação.

Cenário Descrição
Reporting Os relatórios fornecem uma maneira flexível para exibir e resumir dados em um documento impresso. É comum criar um relatório que imprima o conteúdo selecionado de uma fonte de dados na tela ou em uma impressora. 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.
Inserção de Dados É uma forma comum de inserir grandes quantidades de dados relacionados ou de 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 em um banco de dados, cuja estrutura se baseia nas informações inseridas.
Relação mestre/detalhes Um aplicativo mestre/detalhes é um formato para pesquisa em dados relacionados. Especificamente, há duas tabelas de dados com uma relação conectada no exemplo comercial clássico, uma tabela "Clientes" e uma tabela "Pedidos" com uma relação entre eles vinculando clientes e seus respectivos pedidos. Para obter mais informações sobre como criar um aplicativo mestre/detalhado com dois controles do Windows Forms, consulte Como criar um formulário mestre/detalhado usando dois controles DataGridView do Windows Forms DataGridView
Tabela de pesquisa Outro cenário comum de apresentação/manipulação de dados é a pesquisa de tabela. Geralmente, como parte de uma exibição de dados maior, um controle ComboBox é usado para exibir e manipular os dados. A chave é que os dados exibidos no controle ComboBox sejam diferentes dos dados gravados no banco de dados. Por exemplo, se você tiver um controle 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 do banco de dados e para a normalização do banco de dados, você provavelmente armazenará as informações dos itens específicos em uma determinada ordem como números de item (nº 501, nº 603 e assim por diante). Assim, há uma conexão implícita entre o "nome amigável" do item de supermercado no ComboBox controle em seu formulário e o número de item relacionado que está presente em um pedido. É a essência de uma pesquisa de tabela. Para obter mais informações, consulte Como: Criar uma tabela de pesquisa com o componente BindingSource do Windows Forms.

Confira também