方法: Windows フォームの DataGridViewComboBoxCell ドロップダウン リストのオブジェクトにアクセスする
ComboBox コントロールと同様に、DataGridViewComboBoxColumn 型および DataGridViewComboBoxCell 型を使用すると、ドロップダウン リストに無作為のオブジェクトを追加できます。 この機能を使用すると、別のコレクション内の対応するオブジェクトを格納しなくても、ドロップダウン リストの複雑な状態を表すことができます。
ComboBox コントロールとは異なり、DataGridView 型には、現在選択されているオブジェクトを取得するための SelectedItem プロパティはありません。 代わりに、DataGridViewComboBoxColumn.ValueMember プロパティまたは DataGridViewComboBoxCell.ValueMember プロパティをビジネス オブジェクトのプロパティの名前に設定する必要があります。 ユーザーが選択を行うと、ビジネス オブジェクトの指定されたプロパティによってセルの Value プロパティが設定されます。
セル値を使用してビジネス オブジェクトを取得するには、ValueMember
プロパティによって、ビジネス オブジェクト自体への参照を返すプロパティを指定する必要があります。 したがって、ビジネス オブジェクトの型がコントロールの下にない場合は、継承によって型を拡張して、そのようなプロパティを追加する必要があります。
次の手順では、ドロップダウン リストにビジネス オブジェクトを設定し、セルの Value プロパティを使用してそのオブジェクトを取得する方法を説明します。
ドロップダウン リストにビジネス オブジェクトを追加するには
新しい DataGridViewComboBoxColumn を作成し、その Items コレクションにデータを設定します。 または、列の DataSource プロパティにビジネス オブジェクトのコレクションを設定することもできます。 ただし、このケースで、対応するビジネス オブジェクトをコレクション内に作成せずに、ドロップダウン リストに "unassigned" を追加することはできません。
DataGridViewComboBoxColumn assignedToColumn = new DataGridViewComboBoxColumn(); // Populate the combo box drop-down list with Employee objects. foreach (Employee e in employees) assignedToColumn.Items.Add(e); // Add "unassigned" to the drop-down list and display it for // empty AssignedTo values or when the user presses CTRL+0. assignedToColumn.Items.Add("unassigned"); assignedToColumn.DefaultCellStyle.NullValue = "unassigned";
Dim assignedToColumn As New DataGridViewComboBoxColumn() ' Populate the combo box drop-down list with Employee objects. For Each e As Employee In employees assignedToColumn.Items.Add(e) Next ' Add "unassigned" to the drop-down list and display it for ' empty AssignedTo values or when the user presses CTRL+0. assignedToColumn.Items.Add("unassigned") assignedToColumn.DefaultCellStyle.NullValue = "unassigned"
DisplayMember プロパティと ValueMember プロパティを設定します。 DisplayMember によって、ドロップダウン リストに表示するビジネス オブジェクトのプロパティが指定されます。 ValueMember によって、ビジネス オブジェクトへの参照を返すプロパティが指定されます。
assignedToColumn.DisplayMember = "Name"; assignedToColumn.ValueMember = "Self";
assignedToColumn.DisplayMember = "Name" assignedToColumn.ValueMember = "Self"
ビジネス オブジェクト型に、現在のインスタンスへの参照を返すプロパティが含まれていることを確認します。 このプロパティの名前として、前の手順で ValueMember に割り当てられた値が使用されている必要があります。
public Employee Self { get { return this; } }
Public ReadOnly Property Self() As Employee Get Return Me End Get End Property
現在選択されているビジネス オブジェクトを取得するには
セルの Value プロパティを取得し、ビジネス オブジェクト型にキャストします。
// Retrieve the Employee object from the "Assigned To" cell. Employee assignedTo = dataGridView1.Rows[e.RowIndex] .Cells["Assigned To"].Value as Employee;
' Retrieve the Employee object from the "Assigned To" cell. Dim assignedTo As Employee = TryCast(dataGridView1.Rows(e.RowIndex) _ .Cells("Assigned To").Value, Employee)
例
完全な例によって、ドロップダウン リストでのビジネス オブジェクトの使用方法を示します。 この例では、DataGridView コントロールは Task
オブジェクトのコレクションにバインドされています。 各 Task
オブジェクトには AssignedTo
プロパティがあり、そのタスクに現在割り当てられている Employee
オブジェクトが示されます。 Assigned To
列には、割り当てられた各従業員の Name
プロパティ値または "unassigned" (Task.AssignedTo
プロパティ値が null
の場合) が表示されます。
この例の動作を確認するには、次の手順を実行します。
Assigned To
列で割り当てを変更するには、ドロップダウン リストから別の値を選択するか、コンボボックスのセルで CTRL + 0 キーを押します。Generate Report
をクリックして現在の割り当てを表示します。 これで、Assigned To
列の変更によってtasks
コレクションが自動的に更新されることが示されます。Request Status
ボタンをクリックて、その行の現在のEmployee
オブジェクトのRequestStatus
メソッドを呼び出します。 これで、選択したオブジェクトが正常に取得されたことが示されます。
using System;
using System.Text;
using System.Collections.Generic;
using System.Windows.Forms;
public class Form1 : Form
{
private List<Employee> employees = new List<Employee>();
private List<Task> tasks = new List<Task>();
private Button reportButton = new Button();
private DataGridView dataGridView1 = new DataGridView();
[STAThread]
public static void Main()
{
Application.Run(new Form1());
}
public Form1()
{
dataGridView1.Dock = DockStyle.Fill;
dataGridView1.AutoSizeColumnsMode =
DataGridViewAutoSizeColumnsMode.AllCells;
reportButton.Text = "Generate Report";
reportButton.Dock = DockStyle.Top;
reportButton.Click += new EventHandler(reportButton_Click);
Controls.Add(dataGridView1);
Controls.Add(reportButton);
Load += new EventHandler(Form1_Load);
Text = "DataGridViewComboBoxColumn Demo";
}
// Initializes the data source and populates the DataGridView control.
private void Form1_Load(object sender, EventArgs e)
{
PopulateLists();
dataGridView1.AutoGenerateColumns = false;
dataGridView1.DataSource = tasks;
AddColumns();
}
// Populates the employees and tasks lists.
private void PopulateLists()
{
employees.Add(new Employee("Harry"));
employees.Add(new Employee("Sally"));
employees.Add(new Employee("Roy"));
employees.Add(new Employee("Pris"));
tasks.Add(new Task(1, employees[1]));
tasks.Add(new Task(2));
tasks.Add(new Task(3, employees[2]));
tasks.Add(new Task(4));
}
// Configures columns for the DataGridView control.
private void AddColumns()
{
DataGridViewTextBoxColumn idColumn =
new DataGridViewTextBoxColumn();
idColumn.Name = "Task";
idColumn.DataPropertyName = "Id";
idColumn.ReadOnly = true;
DataGridViewComboBoxColumn assignedToColumn =
new DataGridViewComboBoxColumn();
// Populate the combo box drop-down list with Employee objects.
foreach (Employee e in employees) assignedToColumn.Items.Add(e);
// Add "unassigned" to the drop-down list and display it for
// empty AssignedTo values or when the user presses CTRL+0.
assignedToColumn.Items.Add("unassigned");
assignedToColumn.DefaultCellStyle.NullValue = "unassigned";
assignedToColumn.Name = "Assigned To";
assignedToColumn.DataPropertyName = "AssignedTo";
assignedToColumn.AutoComplete = true;
assignedToColumn.DisplayMember = "Name";
assignedToColumn.ValueMember = "Self";
// Add a button column.
DataGridViewButtonColumn buttonColumn =
new DataGridViewButtonColumn();
buttonColumn.HeaderText = "";
buttonColumn.Name = "Status Request";
buttonColumn.Text = "Request Status";
buttonColumn.UseColumnTextForButtonValue = true;
dataGridView1.Columns.Add(idColumn);
dataGridView1.Columns.Add(assignedToColumn);
dataGridView1.Columns.Add(buttonColumn);
// Add a CellClick handler to handle clicks in the button column.
dataGridView1.CellClick +=
new DataGridViewCellEventHandler(dataGridView1_CellClick);
}
// Reports on task assignments.
private void reportButton_Click(object sender, EventArgs e)
{
StringBuilder report = new StringBuilder();
foreach (Task t in tasks)
{
String assignment =
t.AssignedTo == null ?
"unassigned" : "assigned to " + t.AssignedTo.Name;
report.AppendFormat("Task {0} is {1}.", t.Id, assignment);
report.Append(Environment.NewLine);
}
MessageBox.Show(report.ToString(), "Task Assignments");
}
// Calls the Employee.RequestStatus method.
void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
// Ignore clicks that are not on button cells.
if (e.RowIndex < 0 || e.ColumnIndex !=
dataGridView1.Columns["Status Request"].Index) return;
// Retrieve the task ID.
Int32 taskID = (Int32)dataGridView1[0, e.RowIndex].Value;
// Retrieve the Employee object from the "Assigned To" cell.
Employee assignedTo = dataGridView1.Rows[e.RowIndex]
.Cells["Assigned To"].Value as Employee;
// Request status through the Employee object if present.
if (assignedTo != null)
{
assignedTo.RequestStatus(taskID);
}
else
{
MessageBox.Show(String.Format(
"Task {0} is unassigned.", taskID), "Status Request");
}
}
}
public class Task
{
public Task(Int32 id)
{
idValue = id;
}
public Task(Int32 id, Employee assignedTo)
{
idValue = id;
assignedToValue = assignedTo;
}
private Int32 idValue;
public Int32 Id
{
get { return idValue; }
set { idValue = value; }
}
private Employee assignedToValue;
public Employee AssignedTo
{
get { return assignedToValue; }
set { assignedToValue = value; }
}
}
public class Employee
{
public Employee(String name)
{
nameValue = name;
}
private String nameValue;
public String Name
{
get { return nameValue; }
set { nameValue = value; }
}
public Employee Self
{
get { return this; }
}
public void RequestStatus(Int32 taskID)
{
MessageBox.Show(String.Format(
"Status for task {0} has been requested from {1}.",
taskID, nameValue), "Status Request");
}
}
Imports System.Text
Imports System.Collections.Generic
Imports System.Windows.Forms
Public Class Form1
Inherits Form
Private employees As New List(Of Employee)
Private tasks As New List(Of Task)
Private WithEvents reportButton As New Button
Private WithEvents dataGridView1 As New DataGridView
<STAThread()> _
Public Sub Main()
Application.Run(New Form1)
End Sub
Sub New()
dataGridView1.Dock = DockStyle.Fill
dataGridView1.AutoSizeColumnsMode = _
DataGridViewAutoSizeColumnsMode.AllCells
reportButton.Text = "Generate Report"
reportButton.Dock = DockStyle.Top
Controls.Add(dataGridView1)
Controls.Add(reportButton)
Text = "DataGridViewComboBoxColumn Demo"
End Sub
' Initializes the data source and populates the DataGridView control.
Private Sub Form1_Load(ByVal sender As Object, _
ByVal e As EventArgs) Handles Me.Load
PopulateLists()
dataGridView1.AutoGenerateColumns = False
dataGridView1.DataSource = tasks
AddColumns()
End Sub
' Populates the employees and tasks lists.
Private Sub PopulateLists()
employees.Add(New Employee("Harry"))
employees.Add(New Employee("Sally"))
employees.Add(New Employee("Roy"))
employees.Add(New Employee("Pris"))
tasks.Add(New Task(1, employees(1)))
tasks.Add(New Task(2))
tasks.Add(New Task(3, employees(2)))
tasks.Add(New Task(4))
End Sub
' Configures columns for the DataGridView control.
Private Sub AddColumns()
Dim idColumn As New DataGridViewTextBoxColumn()
idColumn.Name = "Task"
idColumn.DataPropertyName = "Id"
idColumn.ReadOnly = True
Dim assignedToColumn As New DataGridViewComboBoxColumn()
' Populate the combo box drop-down list with Employee objects.
For Each e As Employee In employees
assignedToColumn.Items.Add(e)
Next
' Add "unassigned" to the drop-down list and display it for
' empty AssignedTo values or when the user presses CTRL+0.
assignedToColumn.Items.Add("unassigned")
assignedToColumn.DefaultCellStyle.NullValue = "unassigned"
assignedToColumn.Name = "Assigned To"
assignedToColumn.DataPropertyName = "AssignedTo"
assignedToColumn.AutoComplete = True
assignedToColumn.DisplayMember = "Name"
assignedToColumn.ValueMember = "Self"
' Add a button column.
Dim buttonColumn As New DataGridViewButtonColumn()
buttonColumn.HeaderText = ""
buttonColumn.Name = "Status Request"
buttonColumn.Text = "Request Status"
buttonColumn.UseColumnTextForButtonValue = True
dataGridView1.Columns.Add(idColumn)
dataGridView1.Columns.Add(assignedToColumn)
dataGridView1.Columns.Add(buttonColumn)
End Sub
' Reports on task assignments.
Private Sub reportButton_Click(ByVal sender As Object, _
ByVal e As EventArgs) Handles reportButton.Click
Dim report As New StringBuilder()
For Each t As Task In tasks
Dim assignment As String
If t.AssignedTo Is Nothing Then
assignment = "unassigned"
Else
assignment = "assigned to " + t.AssignedTo.Name
End If
report.AppendFormat("Task {0} is {1}.", t.Id, assignment)
report.Append(Environment.NewLine)
Next
MessageBox.Show(report.ToString(), "Task Assignments")
End Sub
' Calls the Employee.RequestStatus method.
Private Sub dataGridView1_CellClick(ByVal sender As Object, _
ByVal e As DataGridViewCellEventArgs) _
Handles dataGridView1.CellClick
' Ignore clicks that are not on button cells.
If e.RowIndex < 0 OrElse Not e.ColumnIndex = _
dataGridView1.Columns("Status Request").Index Then Return
' Retrieve the task ID.
Dim taskID As Int32 = CInt(dataGridView1(0, e.RowIndex).Value)
' Retrieve the Employee object from the "Assigned To" cell.
Dim assignedTo As Employee = TryCast(dataGridView1.Rows(e.RowIndex) _
.Cells("Assigned To").Value, Employee)
' Request status through the Employee object if present.
If assignedTo IsNot Nothing Then
assignedTo.RequestStatus(taskID)
Else
MessageBox.Show(String.Format( _
"Task {0} is unassigned.", taskID), "Status Request")
End If
End Sub
End Class
Public Class Task
Sub New(ByVal id As Int32)
idValue = id
End Sub
Sub New(ByVal id As Int32, ByVal assignedTo As Employee)
idValue = id
assignedToValue = assignedTo
End Sub
Private idValue As Int32
Public Property Id() As Int32
Get
Return idValue
End Get
Set(ByVal value As Int32)
idValue = value
End Set
End Property
Private assignedToValue As Employee
Public Property AssignedTo() As Employee
Get
Return assignedToValue
End Get
Set(ByVal value As Employee)
assignedToValue = value
End Set
End Property
End Class
Public Class Employee
Sub New(ByVal name As String)
nameValue = name
End Sub
Private nameValue As String
Public Property Name() As String
Get
Return nameValue
End Get
Set(ByVal value As String)
nameValue = value
End Set
End Property
Public ReadOnly Property Self() As Employee
Get
Return Me
End Get
End Property
Public Sub RequestStatus(ByVal taskID As Int32)
MessageBox.Show(String.Format( _
"Status for task {0} has been requested from {1}.", _
taskID, nameValue), "Status Request")
End Sub
End Class
コードのコンパイル
この例で必要な要素は次のとおりです。
- System アセンブリおよび System.Windows.Forms アセンブリへの参照。
関連項目
- DataGridView
- DataGridViewComboBoxColumn
- DataGridViewComboBoxColumn.Items
- DataGridViewComboBoxColumn.DataSource
- DataGridViewComboBoxColumn.ValueMember
- DataGridViewComboBoxCell
- DataGridViewComboBoxCell.Items
- DataGridViewComboBoxCell.DataSource
- DataGridViewComboBoxCell.ValueMember
- DataGridViewCell.Value
- ComboBox
- Windows フォーム DataGridView コントロールでのデータの表示
.NET Desktop feedback