Como: Objetos de acesso vinculado para Windows Forms linhas de DataGridView

Às vezes é útil exibir uma tabela de informações armazenadas em uma coleção de objetos de negócios. Quando você vincula um DataGridView controle como uma coleção, cada propriedade pública é exibido em sua própria coluna a menos que a propriedade foi marcado como não-navegável com um BrowsableAttribute. Por exemplo, uma coleção de Customer objetos teria colunas como nome e endereço.

Se esses objetos contêm informações adicionais e o código que você deseja acessar, você pode contatá-lo através de objetos de linha. No exemplo de código a seguir, os usuários podem selecionar várias linhas e clique em um botão para enviar uma fatura a cada um dos clientes correspondentes.

Para acessar objetos vinculados a linha

  • Use o DataGridViewRow.DataBoundItem propriedade.

    Private Sub InvoiceButton_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles InvoiceButton.Click
    
        For Each row As DataGridViewRow In Me.DataGridView1.SelectedRows
    
            Dim cust As Customer = TryCast(row.DataBoundItem, Customer)
            If cust IsNot Nothing Then
                cust.SendInvoice()
            End If
    
        Next
    
    End Sub
    
    void invoiceButton_Click(object sender, EventArgs e)
    {
        foreach (DataGridViewRow row in this.dataGridView1.SelectedRows)
        {
            Customer cust = row.DataBoundItem as Customer;
            if (cust != null)
            {
                cust.SendInvoice();
            }
        }
    }
    

Exemplo

O exemplo de código completo inclui uma simples Customer ligações e a implementação de DataGridView para um ArrayList contendo alguns Customer objetos. O Click manipulador de eventos da System.Windows.Forms.Button deve acessar o Customer objetos por meio de linhas, porque a coleção de cliente não é acessível de fora a Form.Load manipulador de eventos.

Imports System
Imports System.Windows.Forms

Public Class DataGridViewObjectBinding
    Inherits Form

    ' These declarations and the Main() and New() methods 
    ' below can be replaced with designer-generated code. 
    Private WithEvents InvoiceButton As New Button()
    Private WithEvents DataGridView1 As New DataGridView()

    ' Entry point code. 
    <STAThreadAttribute()> _
    Public Shared Sub Main()

        Application.Run(New DataGridViewObjectBinding())

    End Sub

    ' Sets up the form. 
    Public Sub New()

        Me.DataGridView1.Dock = DockStyle.Fill
        Me.Controls.Add(Me.DataGridView1)

        Me.InvoiceButton.Text = "invoice the selected customers"
        Me.InvoiceButton.Dock = DockStyle.Top
        Me.Controls.Add(Me.InvoiceButton)
        Me.Text = "DataGridView collection-binding demo"

    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles MyBase.Load

        ' Set up a collection of objects for binding.
        Dim customers As New System.Collections.ArrayList()
        customers.Add(New Customer("Harry"))
        customers.Add(New Customer("Sally"))
        customers.Add(New Customer("Roy"))
        customers.Add(New Customer("Pris"))

        ' Initialize and bind the DataGridView.
        Me.DataGridView1.SelectionMode = _
            DataGridViewSelectionMode.FullRowSelect
        Me.DataGridView1.AutoGenerateColumns = True
        Me.DataGridView1.DataSource = customers

    End Sub

    ' Calls the SendInvoice() method for the Customer 
    ' object bound to each selected row.
    Private Sub InvoiceButton_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles InvoiceButton.Click

        For Each row As DataGridViewRow In Me.DataGridView1.SelectedRows

            Dim cust As Customer = TryCast(row.DataBoundItem, Customer)
            If cust IsNot Nothing Then
                cust.SendInvoice()
            End If

        Next

    End Sub

End Class

Public Class Customer

    Private nameValue As String

    Public Sub New(ByVal name As String)
        nameValue = name
    End Sub

    Public Property Name() As String
        Get
            Return nameValue
        End Get
        Set(ByVal value As String)
            nameValue = value
        End Set
    End Property

    Public Sub SendInvoice()
        MsgBox(nameValue & " has been billed.")
    End Sub

End Class
using System;
using System.Windows.Forms;

public class DataGridViewObjectBinding : Form
{
    // These declarations and the Main() and New() methods 
    // below can be replaced with designer-generated code. 
    private Button invoiceButton = new Button();
    private DataGridView dataGridView1 = new DataGridView();

    // Entry point code. 
    [STAThreadAttribute()]
    public static void Main()
    {
        Application.Run(new DataGridViewObjectBinding());
    }

    // Sets up the form.
    public DataGridViewObjectBinding()
    {
        this.dataGridView1.Dock = DockStyle.Fill;
        this.Controls.Add(this.dataGridView1);

        this.invoiceButton.Text = "invoice the selected customers";
        this.invoiceButton.Dock = DockStyle.Top;
        this.invoiceButton.Click += new EventHandler(invoiceButton_Click);
        this.Controls.Add(this.invoiceButton);

        this.Load += new EventHandler(DataGridViewObjectBinding_Load);
        this.Text = "DataGridView collection-binding demo";
    }

    void  DataGridViewObjectBinding_Load(object sender, EventArgs e)
    {
        // Set up a collection of objects for binding.
        System.Collections.ArrayList customers = new System.Collections.ArrayList();
        customers.Add(new Customer("Harry"));
        customers.Add(new Customer("Sally"));
        customers.Add(new Customer("Roy"));
        customers.Add(new Customer("Pris"));

        // Initialize and bind the DataGridView.
        this.dataGridView1.SelectionMode = 
            DataGridViewSelectionMode.FullRowSelect;
        this.dataGridView1.AutoGenerateColumns = true;
        this.dataGridView1.DataSource = customers;
    }

    // Calls the SendInvoice() method for the Customer 
    // object bound to each selected row.
    void invoiceButton_Click(object sender, EventArgs e)
    {
        foreach (DataGridViewRow row in this.dataGridView1.SelectedRows)
        {
            Customer cust = row.DataBoundItem as Customer;
            if (cust != null)
            {
                cust.SendInvoice();
            }
        }
    }
}

public class Customer
{
    private String nameValue;

    public Customer(String name)
    {
        nameValue = name;
    }

    public String Name
    {
        get
        {
            return nameValue;
        }
        set 
        {
            nameValue = value;
        }
    }

    public void SendInvoice()
    {
        MessageBox.Show(nameValue + " has been billed.");
    }
}

Compilando o código

Este exemplo requer:

  • Referências aos assemblies System.Windows.Forms e de sistema.

Para obter informações sobre como criar este exemplo a partir da linha de comando para Visual Basic ou Visual C#, consulte Compilando a partir da linha de comando (Visual Basic) ou Comando -<>>linha criando com CSC. exe. Você também pode construir este exemplo no Visual Studio colando o código em um novo projeto. Para obter mais informações, consulte Como: Compilar e executar um exemplo de código Windows Forms concluída usando Visual Studio e Como: Compilar e executar um exemplo de código Windows Forms concluída usando Visual Studio e Como: Compilar e executar um exemplo de código Windows Forms concluída usando Visual Studio e Como: Compilar e executar um exemplo de código de formulários Windows concluída usando o Visual Studio e Como: Compilar e executar um exemplo de código de formulários de Windows completa usando Visual Studio e Como compilar e executar um exemplo de código dos Windows Forms concluído usando Visual Studio.

Consulte também

Tarefas

Como: Vincular objetos aos controles do Windows Forms DataGridView

Referência

DataGridView

DataGridViewRow

DataGridViewRow.DataBoundItem

Outros recursos

Exibir dados em Windows Forms DataGridView Control