Associar objetos no Visual Studio
Publicado: agosto de 2016
Visual Studio fornece ferramentas em tempo de design para trabalhar com objetos personalizados (ao contrário de outras fontes de dados como entidades, conjuntos de dados e serviços) como a fonte de dados em seu aplicativo. Quando você deseja armazenar os dados de um banco de dados em um objeto que você associar a controles de interface do usuário, a abordagem recomendada é usar o Entity Framework para gerar a classe ou classes. EF irá gerar automaticamente todo o código de controle de alterações de texto clichê, o que significa que quaisquer alterações feitas nos objetos locais automaticamente serão persistentes no banco de dados quando você chamar AcceptChanges no objeto DbSet. Para obter mais informações, consulte documentação do Entity Framework.
Dica
As abordagens para associação de objeto neste artigo só devem ser consideradas se seu aplicativo já com base em conjuntos de dados ou se você já estiver familiarizado com conjuntos de dados e os dados que forem processados tabular e não muito complexa ou muito grande. Para obter um exemplo ainda mais simples de carregamento de dados diretamente em objetos usando um DataReader e atualizar manualmente a interface do usuário sem ligação de dados, consulte Criar um aplicativo simples de dados usando o ADO.NET.
Requisitos de objeto
O único requisito de objetos personalizados trabalhar com os dados, ferramentas de design no Visual Studio é que o objeto precisa de pelo menos uma propriedade pública.
Em geral, objetos personalizados não exigem qualquer interfaces específicas, construtor ou atributos para agir como uma fonte de dados para um aplicativo. No entanto, se você deseja arrastar o objeto a partir o fontes de dados janela para uma superfície de design para criar um controle ligado a dados, e se o objeto implementa a ITypedList ou IListSource interface, o objeto deve ter um construtor padrão. Caso contrário, o Visual Studio não é possível instanciar o objeto de fonte de dados, e ele exibirá um erro quando você arrasta o item para a superfície de design.
Exemplos de como usar objetos personalizados como fontes de dados
Enquanto houver incontáveis maneiras de implementar a lógica do aplicativo ao trabalhar com objetos como uma fonte de dados, para o SQL há bancos de dados são poucas operações padrões que podem ser simplificadas usando os objetos TableAdapter gerados do Visual Studio. Esta página explica como implementar esses processos padrões usando TableAdapters; ele não se destina como um guia para a criação de seus objetos personalizados. Por exemplo, normalmente você executará as seguintes operações padrões independentemente da implementação específica de seus objetos, ou lógica do aplicativo:
Carregando dados em objetos (normalmente de um banco de dados).
Criando uma coleção tipada de objetos.
Adicionando objetos e remover objetos de uma coleção.
Exibir os dados de objeto aos usuários em um formulário.
Alteração/edição de dados em um objeto.
Salvar dados de objetos no banco de dados.
Dica
Para melhor entender e fornecer contexto para os exemplos nesta página, é recomendável que você conclua o seguinte: Instruções passo a passo: conectando a dados em objetos (Windows Forms). Essa explicação passo a passo cria os objetos discutidos nesta página de Ajuda.
Carregando dados em objetos
Para este exemplo, você pode carregar dados para os objetos usando TableAdapters. Por padrão, os TableAdapters são criados com dois tipos de métodos que buscam dados de um banco de dados e popular tabelas de dados.
O
TableAdapter.Fill
método preenche uma tabela de dados existente com os dados retornados.O
TableAdapter.GetData
método retorna uma nova tabela de dados preenchida com dados.
A maneira mais fácil de carregar os objetos personalizados com dados é chamar o TableAdapter.GetData
método, percorrer a coleção de linhas na tabela de dados retornados e preencher cada objeto com os valores em cada linha. Você pode criar um GetData
método que retorna uma tabela de dados preenchida para qualquer consulta adicionada a um TableAdapter.
Dica
Visual Studio nomeia as consultas TableAdapter Fill
e GetData
por padrão, mas esses nomes podem ser alterados para qualquer nome de método válido.
O exemplo a seguir mostra como percorrer as linhas em uma tabela de dados e preencher um objeto com dados:
private void LoadCustomers()
{
NorthwindDataSet.CustomersDataTable customerData =
customersTableAdapter1.GetTop5Customers();
foreach (NorthwindDataSet.CustomersRow customerRow in customerData)
{
Customer currentCustomer = new Customer();
currentCustomer.CustomerID = customerRow.CustomerID;
currentCustomer.CompanyName = customerRow.CompanyName;
if (customerRow.IsAddressNull() == false)
{
currentCustomer.Address = customerRow.Address;
}
if (customerRow.IsCityNull() == false)
{
currentCustomer.City = customerRow.City;
}
if (customerRow.IsContactNameNull() == false)
{
currentCustomer.ContactName = customerRow.ContactName;
}
if (customerRow.IsContactTitleNull() == false)
{
currentCustomer.ContactTitle = customerRow.ContactTitle;
}
if (customerRow.IsCountryNull() == false)
{
currentCustomer.Country = customerRow.Country;
}
if (customerRow.IsFaxNull() == false)
{
currentCustomer.Fax = customerRow.Fax;
}
if (customerRow.IsPhoneNull() == false)
{
currentCustomer.Phone = customerRow.Phone;
}
if (customerRow.IsPostalCodeNull() == false)
{
currentCustomer.PostalCode = customerRow.PostalCode;
}
if (customerRow.IsRegionNull() == false)
{
currentCustomer.Region = customerRow.Region;
}
LoadOrders(currentCustomer);
customerBindingSource.Add(currentCustomer);
}
}
Private Sub LoadCustomers()
Dim customerData As NorthwindDataSet.CustomersDataTable =
CustomersTableAdapter1.GetTop5Customers()
Dim customerRow As NorthwindDataSet.CustomersRow
For Each customerRow In customerData
Dim currentCustomer As New Customer()
With currentCustomer
.CustomerID = customerRow.CustomerID
.CompanyName = customerRow.CompanyName
If Not customerRow.IsAddressNull Then
.Address = customerRow.Address
End If
If Not customerRow.IsCityNull Then
.City = customerRow.City
End If
If Not customerRow.IsContactNameNull Then
.ContactName = customerRow.ContactName
End If
If Not customerRow.IsContactTitleNull Then
.ContactTitle = customerRow.ContactTitle
End If
If Not customerRow.IsCountryNull Then
.Country = customerRow.Country
End If
If Not customerRow.IsFaxNull Then
.Fax = customerRow.Fax
End If
If Not customerRow.IsPhoneNull Then
.Phone = customerRow.Phone
End If
If Not customerRow.IsPostalCodeNull Then
.PostalCode = customerRow.PostalCode
End If
If Not customerRow.Is_RegionNull Then
.Region = customerRow._Region
End If
End With
LoadOrders(currentCustomer)
CustomerBindingSource.Add(currentCustomer)
Next
End Sub
Criando uma coleção tipada de objetos
Você pode criar classes de coleção para os objetos ou usar as coleções tipadas que são automaticamente fornecidas pelo Componente BindingSource.
Quando você estiver criando uma classe de coleção personalizada para objetos, é recomendável que você herde da BindingList<T>. Essa classe genérica fornece funcionalidade para administrar sua coleção, bem como a capacidade de gerar eventos que enviam notificações para a infra-estrutura de ligação de dados no Windows Forms.
A coleção gerada automaticamente na BindingSource usa um BindingList<T> para sua coleção tipada. Se seu aplicativo não requer funcionalidade adicional, você pode manter sua coleção dentro do BindingSource. Para obter mais informações, consulte o List propriedade o BindingSource classe.
Dica
Se sua coleção exigir funcionalidade não fornecida pela implementação base da BindingList<T>, então você deve criar uma coleção personalizada para que você possa adicionar à classe conforme necessário.
O código a seguir mostra como criar a classe para uma coleção fortemente tipada de Order
objetos:
/// <summary>
/// A collection of Orders
/// </summary>
public class Orders: System.ComponentModel.BindingList<Order>
{
// Add any additional functionality required by your collection.
}
''' <summary>
''' A collection of Orders
''' </summary>
Public Class Orders
Inherits System.ComponentModel.BindingList(Of Order)
' Add any additional functionality required by your collection.
End Class
Adicionando objetos a uma coleção
Adicionar objetos a uma coleção, chamando o Add
método de sua classe de coleção personalizada ou do BindingSource.
Para obter um exemplo de como adicionar a uma coleção usando um BindingSource, consulte o LoadCustomers
método Instruções passo a passo: conectando a dados em objetos (Windows Forms).
Para obter um exemplo de como adicionar objetos a uma coleção personalizada, consulte o LoadOrders
método Instruções passo a passo: conectando a dados em objetos (Windows Forms).
Dica
O Add
método é fornecido automaticamente para sua coleção personalizada quando você herda do BindingList<T>.
O código a seguir mostra como adicionar objetos a uma coleção tipada em um BindingSource:
Customer currentCustomer = new Customer();
customerBindingSource.Add(currentCustomer);
Dim currentCustomer As New Customer()
CustomerBindingSource.Add(currentCustomer)
O código a seguir mostra como adicionar objetos a uma coleção tipada que herda do BindingList<T>:
Dica
Neste exemplo o Orders
coleção é uma propriedade do Customer
objeto.
Order currentOrder = new Order();
currentCustomer.Orders.Add(currentOrder);
Dim currentOrder As New Order()
currentCustomer.Orders.Add(currentOrder)
Remover objetos de uma coleção
Remover objetos de uma coleção, chamando o Remove
ou RemoveAt
método de sua classe de coleção personalizada ou do BindingSource.
Dica
O Remove
e RemoveAt
métodos são fornecidos automaticamente para sua coleção personalizada quando você herda do BindingList<T>.
O código a seguir mostra como localizar e remover objetos da coleção tipada em um BindingSource com o RemoveAt método:
int customerIndex = customerBindingSource.Find("CustomerID", "ALFKI");
customerBindingSource.RemoveAt(customerIndex);
Dim customerIndex As Integer = CustomerBindingSource.Find("CustomerID", "ALFKI")
CustomerBindingSource.RemoveAt(customerIndex)
Exibindo dados de objeto para usuários
Para exibir os dados em objetos para usuários, você cria uma fonte de dados de objeto usando o Data Source Configuration Wizard, e, em seguida, arraste o objeto inteiro ou propriedades individuais para seu formulário a partir de fontes de dados janela.
Modificando os dados em objetos
Para editar dados em objetos personalizados que são associados a dados a controles de Windows Forms, basta edite os dados no controle de limite (ou diretamente nas propriedades do objeto). Arquitetura de ligação de dados irá atualizar os dados no objeto.
Se seu aplicativo exigir o rastreamento de alterações e recuo nas alterações propostas para seus valores originais, você deve implementar essa funcionalidade no seu modelo de objeto. Para obter exemplos de como tabelas de dados manter controle de alterações propostas, consulte DataRowState, HasChanges, e GetChanges.
Salvando dados em objetos do banco de dados
Você pode salvar dados no banco de dados, passando os valores de seu objeto para métodos DBDirect do TableAdapter.
O Visual Studio cria métodos DBDirect que podem ser executados diretamente no banco de dados. Esses métodos não requerem objetos DataSet ou DataTable.
Método TableAdapter DBDirect | Descrição |
---|---|
TableAdapter.Insert |
Adiciona novos registros em um banco de dados, permitindo que você passe valores individuais de coluna como parâmetros do método. |
TableAdapter.Update |
Atualizações de registros existentes em um banco de dados. O método Update aceita valores da coluna original e novo como parâmetros de método. Os valores originais são usados para localizar o registro original e os novos valores são usados para atualizar esse registro. O TableAdapter.Update método também é usado para acomodar as alterações em um conjunto de dados no banco de dados fazendo uma DataSet, DataTable, DataRow, ou uma matriz de DataRows como parâmetros do método. |
TableAdapter.Delete |
Exclui registros existentes do banco de dados com base em valores da coluna original passados como parâmetros de método. |
Para salvar dados de uma coleção de objetos, percorrer a coleção de objetos (por exemplo, usando um loop for-next) e envie os valores para cada objeto de banco de dados usando métodos DBDirect do TableAdapter.
O exemplo a seguir mostra como usar o TableAdapter.Insert
Método DBDirect para adicionar um novo cliente diretamente ao banco de dados:
private void AddNewCustomers(Customer currentCustomer)
{
customersTableAdapter.Insert(
currentCustomer.CustomerID,
currentCustomer.CompanyName,
currentCustomer.ContactName,
currentCustomer.ContactTitle,
currentCustomer.Address,
currentCustomer.City,
currentCustomer.Region,
currentCustomer.PostalCode,
currentCustomer.Country,
currentCustomer.Phone,
currentCustomer.Fax);
}
Private Sub AddNewCustomer(ByVal currentCustomer As Customer)
CustomersTableAdapter.Insert(
currentCustomer.CustomerID,
currentCustomer.CompanyName,
currentCustomer.ContactName,
currentCustomer.ContactTitle,
currentCustomer.Address,
currentCustomer.City,
currentCustomer.Region,
currentCustomer.PostalCode,
currentCustomer.Country,
currentCustomer.Phone,
currentCustomer.Fax)
End Sub