方法 : Windows フォームの DataGridView 行にバインドされたオブジェクトにアクセスする
更新 : 2007 年 11 月
ビジネス オブジェクトのコレクション内に格納された情報の表を表示できると便利な場合があります。このようなコレクションに DataGridView コントロールをバインドすると、BrowsableAttribute でプロパティが参照不可とマークされていない限り、各パブリック プロパティは独自の列に表示されます。たとえば、Customer オブジェクトのコレクションには、[Name] や [Address] などの列があります。
アクセスする追加情報やコードがこれらのオブジェクトに含まれる場合は、行オブジェクトを通じてアクセスできます。次のコード例では、ユーザーが複数の行を選択してボタンをクリックすると、対応する各顧客に請求書が送信されます。
行にバインドされたオブジェクトにアクセスするには
DataGridViewRow.DataBoundItem プロパティを使用します。
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(); } } }
使用例
次の完全なコード例には、簡単な Customer 実装が含まれています。この例では、少数の Customer オブジェクトを格納する ArrayList に DataGridView をバインドします。System.Windows.Forms.Button の Click イベント ハンドラは行を介して Customer オブジェクトにアクセスする必要があります。これは、Form.Load イベント ハンドラの外部では顧客のコレクションにアクセスできないためです。
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.");
}
}
コードのコンパイル方法
この例で必要な要素は次のとおりです。
- System アセンブリと System.Windows.Forms アセンブリへの参照。
Visual Basic または Visual C# のコマンド ラインからこの例をビルドする方法の詳細については、「コマンド ラインからのビルド (Visual Basic)」または「csc.exe を使用したコマンド ラインからのビルド」を参照してください。Visual Studio で新しいプロジェクトにコードを貼り付けてこの例をビルドすることもできます。 方法 : 完成した Windows フォーム コードの例を Visual Studio を使ってコンパイルして実行する
方法 : 完成した Windows フォーム コードの例を Visual Studio を使ってコンパイルして実行する
方法 : 完成した Windows フォーム コードの例を Visual Studio を使ってコンパイルして実行する
方法 : 完成した Windows フォーム コードの例を Visual Studio を使ってコンパイルして実行する
方法 : 完成した Windows フォーム コードの例を Visual Studio を使ってコンパイルして実行する
参照
処理手順
方法 : オブジェクトを Windows フォーム DataGridView コントロールにバインドする