ReoGrid 提供了 单元格主体 功能来创建自定义单元格类型。内置的 DropdownCell 单元格主体类型提供了创建用户友好的自定义下拉单元格的能力。了解更多关于 内置单元格类型

要创建自定义下拉单元格,需要创建一个继承自 DropdownCell 类的自定义类,该类位于 unvell.ReoGrid.CellTypes 命名空间中。

下拉界面

DropdownCell 类提供了创建用户自定义下拉单元格的最简单方式。它在单元格右侧显示一个箭头按钮,并响应用户操作来显示和隐藏下拉面板。

186

使用 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 控件的空面板。

187

要在列表视图中显示选择项,使用以下代码添加项目:

// 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 });

再次运行程序: 188

如您所见,ListView 控件及占位项已显示,但下拉面板太窄。要解决此问题,设置 DropdownCell 实例的 MinimumDropdownWidth 属性:

// enlarge the dropdown panel
this.MinimumDropdownWidth = 300;

189

接收选中项

处理列表视图的 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
  }
}

运行程序并尝试从下拉列表中选择项目;选中的项目将显示在单元格内。

190

最后,为下拉单元格设置边框和初始文本:

worksheet["B2"] = "Choose...";
worksheet["B2"] = new ListViewDropdownCell();
worksheet.Ranges["B2"].BorderOutline = BorderStyle.GraySolid;

最终效果

编辑前: 192

选择项目: 193

编辑后: 194

完整源代码和演示可在下载页面的发布包中包含的演示项目中找到。

下拉单元格中的电子表格

如果您想实现一个允许最终用户从子电子表格中选择内容的功能,也可以考虑在下拉面板中放置另一个 ReoGrid 实例。

这篇文章对您有帮助吗?