Partilhar via


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

Consulte também

Associar controles a dados no Visual Studio