视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
如何:访问 Windows 窗体 DataGridViewComboBoxCell 下拉列表中的对象
2025-09-29 02:55:10 责编:小OO
文档
如何:访问 Windows 窗体 DataGridViewComboBoxCell 下拉列表中的对象

Visual Studio 2010

其他版本

* Visual Studio 2008

* .NET Framework 3.0

此内容为质量更高的人工翻译。若想同时查看此页面和原始英文页面的内容,请单击“首选项”然后选择“经典视图”作为您的查看首选项。

与 ComboBox 控件一样,DataGridViewComboBoxColumn 和 DataGridViewComboBoxCell 类型允许向其下拉列表添加任意对象。 使用此功能,可以在下拉列表中表示复杂的状态,而不必在单独集合中存储相应的对象。

与 ComboBox 控件不同,DataGridView 类型不具有用于检索当前所选对象的 SelectedItem 属性, 必须将 DataGridViewComboBoxColumn.ValueMember 或 DataGridViewComboBoxCell.ValueMember 属性设置为业务对象的属性名称。 当用户进行选择时,指示的业务对象属性将设置单元格 Value 属性。

要通过单元格值检索业务对象,ValueMember 属性必须指示一个属性,该属性返回对业务对象本身的引用。 因此,如果业务对象的类型不受您的控制,您必须通过继承来扩展该类型,从而添加此类属性。

下面的过程演示如何用业务对象填充下拉列表并通过单元格 Value 属性检索对象。

1.创建新的 DataGridViewComboBoxColumn 并填充其 Items 集合。 或者,可以将列 DataSource 属性设置为业务对象的集合。 但在这种情况下,如果没有在集合中创建相应的业务对象,就不能向下拉列表添加“未赋值”。

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";

2.设置 DisplayMember 和 ValueMember 属性。 DisplayMember 指示要显示在下拉列表中的业务对象的属性。 ValueMember 指示返回对业务对象的引用的属性。

assignedToColumn.DisplayMember = "Name";

assignedToColumn.ValueMember = "Self";

3.确保业务对象类型包含一个属性,该属性返回对当前实例的引用。 此属性必须以上一步中分配给 ValueMember 的值来命名。

public Employee Self

{

get { return this; }

}

检索当前所选的业务对象

*

获取单元格 Value 属性,将其强制转换为业务对象类型。

// Retrieve the Employee object from the "Assigned To" cell.

Employee assignedTo = dataGridView1.Rows[e.RowIndex]

.Cells["Assigned To"].Value as Employee;

示例:

整个示例演示了对下拉列表中业务对象的使用。 在此示例中,DataGridView 控件被绑定到 Task 对象的

集合。 每个 Task 对象都有一个 AssignedTo 属性,该属性指示当前分配给该任务的 Employee 对象。 Assigned To 列显示每个已分配员工的 Name 属性值;如果 Task.AssignedTo 属性值为 null,则显示“未赋值”。

要查看此示例的行为,请执行下列步骤:

1.

从下拉列表选择不同的值,或在组合框单元格中按 CTRL+0,从而更改 Assigned To 列中的赋值。

2.

单击 Generate Report 以显示当前赋值。 此操作演示 Assigned To 列中的更改会自动更新 tasks 集合。

3.

单击 Request Status 按钮,以便为该行调用当前 Employee 对象的 RequestStatus 方法。 此操作演示所选对象已检索成功。

using System;

using System.Text;

using System.Collections.Generic;

using System.Windows.Forms;

public class Form1 : Form

{

private List employees = new List();

private List tasks = new List();

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) assig

nedToColumn.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}.

alue; }

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}.下载本文

显示全文
专题