ReoGrid 提供了 单元格主体 功能来创建自定义单元格类型。内置的 DropdownCell 单元格主体类型提供了创建用户友好的自定义下拉单元格的能力。了解更多关于 内置单元格类型。
要创建自定义下拉单元格,需要创建一个继承自 DropdownCell 类的自定义类,该类位于 unvell.ReoGrid.CellTypes 命名空间中。
下拉界面
DropdownCell 类提供了创建用户自定义下拉单元格的最简单方式。它在单元格右侧显示一个箭头按钮,并响应用户操作来显示和隐藏下拉面板。

使用 DropdownCell 类时,只需完成以下操作:
- 将控件设置到下拉面板中
- 将控件中的选中项设置为单元格的数据
DropdownCell 提供了一个名为 DropdownControl 的属性,用于指定在下拉面板内显示的控件。
创建下拉 ListView
本示例展示如何创建一个显示标准 .NET ListView 控件的下拉单元格。创建一个名为 ListViewDropdownCell 的类,使其继承自 DropdownCell 类。
class ListViewDropdownCell : DropdownCell
{
private ListView listView;
public ListViewDropdownCell()
{
// Initial code goes here
}
}
在构造函数中,初始化 ListView 并将其赋值给 DropdownControl 属性。
public ListViewDropdownCell()
{
// initialize listview
this.listView = new ListView()
{
BorderStyle = System.Windows.Forms.BorderStyle.None,
View = View.Details,
FullRowSelect = true,
};
// set listview as drop-down control
this.DropdownControl = this.listView;
}
使用以下代码将此 ListViewDropdownCell 实例添加到 ReoGrid 工作表中:
worksheet["B2"] = new ListViewDropdownCell();
注意: 您也可以使用单元格实例的
Body属性来更改单元格主体对象。将Body属性设置为null将从单元格中移除单元格主体。 运行程序并点击下拉按钮;将显示一个包含ListView控件的空面板。

要在列表视图中显示选择项,使用以下代码添加项目:
// add listview columns
this.listView.Columns.Add("Column 1", 120);
this.listView.Columns.Add("Column 2", 120);
// add groups and items
var group1 = listView.Groups.Add("grp1", "Group 1");
listView.Items.Add(new ListViewItem(new string[] { "Item 1.1", "Subitem 1.1" }) { Group = group1 });
listView.Items.Add(new ListViewItem(new string[] { "Item 1.2", "Subitem 1.2" }) { Group = group1 });
listView.Items.Add(new ListViewItem(new string[] { "Item 1.3", "Subitem 1.3" }) { Group = group1 });
var group2 = listView.Groups.Add("grp2", "Group 2");
listView.Items.Add(new ListViewItem(new string[] { "Item 2.1", "Subitem 2.1" }) { Group = group2 });
listView.Items.Add(new ListViewItem(new string[] { "Item 2.2", "Subitem 2.2" }) { Group = group2 });
listView.Items.Add(new ListViewItem(new string[] { "Item 2.3", "Subitem 2.3" }) { Group = group2 });
再次运行程序:

如您所见,ListView 控件及占位项已显示,但下拉面板太窄。要解决此问题,设置 DropdownCell 实例的 MinimumDropdownWidth 属性:
// enlarge the dropdown panel
this.MinimumDropdownWidth = 300;

接收选中项
处理列表视图的 Click 事件来设置选中项:
// add click event handler
this.listView.Click += listView_Click;
Event handler:
void listView_Click(object sender, EventArgs e)
{
if (this.listView.SelectedItems.Count > 0)
{
// set first selected item as cell's data
this.Cell.Data = this.listView.SelectedItems[0].Text;
this.PullUp(); // pull up the drop-down panel to finish editing
}
}
运行程序并尝试从下拉列表中选择项目;选中的项目将显示在单元格内。

最后,为下拉单元格设置边框和初始文本:
worksheet["B2"] = "Choose...";
worksheet["B2"] = new ListViewDropdownCell();
worksheet.Ranges["B2"].BorderOutline = BorderStyle.GraySolid;
最终效果
编辑前:

选择项目:

编辑后:

完整源代码和演示可在下载页面的发布包中包含的演示项目中找到。
下拉单元格中的电子表格
如果您想实现一个允许最终用户从子电子表格中选择内容的功能,也可以考虑在下拉面板中放置另一个 ReoGrid 实例。