ReoGrid 中的单元格可以托管一个单元格主体 — 一个渲染自定义内容并处理用户交互的组件。ReoGrid 提供了许多内置的单元格主体类型,用于常见的 UI 控件。
命名空间
using unvell.ReoGrid.CellTypes;
可用的单元格类型
| 类 | 示例 | 说明 |
|---|---|---|
ButtonCell | ![]() | 通用按钮 |
CheckBoxCell | ![]() | 复选框(切换 true/false) |
RadioButtonCell | ![]() | 单选按钮(同组内互斥) |
HyperlinkCell | ![]() | 带可选自动导航的超链接 |
DropdownListCell | ![]() | 用于单项选择的下拉列表 |
ComboListCell | 带文本输入和下拉选择的组合框 | |
ProgressCell | ![]() | 进度条(值 0–1) |
NegativeProgressCell | ![]() | 正/负进度条 |
ImageCell | ![]() | 显示图片 |
ImageButtonCell | ![]() | 按钮上的图片 |
DatePickerCell | ![]() | 带日历下拉的日期选择器 |
ColumnDropdownListCell | 使用列数据作为来源的下拉列表 |
设置单元格主体
// 通过工作表索引器
sheet[1, 2] = new ButtonCell("Click Me");
// 通过单元格实例
var cell = sheet.Cells["C3"];
cell.Body = new CheckBoxCell();
ICellBody 接口
所有单元格主体都实现 ICellBody。CellBody 基类提供默认实现:
| 成员 | 说明 |
|---|---|
OnSetup(Cell cell) | 当主体附加到单元格时调用 |
OnPaint(CellDrawingContext dc) | 渲染单元格主体 |
OnMouseDown/Up/Move/Enter/Leave | 鼠标交互处理程序(返回 true 以消费事件) |
OnMouseWheel(e) | 鼠标滚轮处理程序 |
OnKeyDown/Up(KeyCode) | 键盘处理程序(返回 true 以消费) |
OnStartEdit() | 当单元格进入编辑模式时调用(返回 false 以阻止) |
OnEndEdit(data, reason) | 编辑结束时调用(返回修改后的数据或原始数据) |
OnSetData(data) | 设置单元格数据时调用(返回修改后的数据或原始数据) |
OnGotFocus() / OnLostFocus() | 焦点变化处理程序 |
AutoCaptureMouse() | 是否捕获鼠标事件(默认:true) |
DisableWhenCellReadonly | 单元格只读时是否禁用主体(默认:true) |
Cell | 父单元格(只读,在 OnSetup 后可用) |
Clone() | 创建单元格主体的副本 |
有关创建自定义单元格主体,请参阅 自定义单元格。
ButtonCell
可点击按钮,将单元格数据显示为标签。

// 带默认文本
sheet[1, 2] = new ButtonCell("Hello");
// 不带文本 — 使用单元格数据作为标签
sheet[1, 2] = new ButtonCell();
sheet[1, 2] = "Hello";
属性
| 属性 | 类型 | 说明 |
|---|---|---|
IsPressed | bool | 按钮是否当前被按下 |
事件
| 事件 | 说明 |
|---|---|
Click | 用户点击按钮时触发 |
方法
| 方法 | 说明 |
|---|---|
PerformClick() | 以编程方式模拟按钮点击 |
var button = new ButtonCell("Hello");
button.Click += (s, e) => MessageBox.Show("Button clicked");
sheet["C3"] = button;
// 编程方式点击
button.PerformClick();
自定义按钮外观
通过单元格样式更改按钮标签颜色:
var cell = sheet.Cells["C3"];
cell.Style.TextColor = Color.Blue;
cell.Body = new ButtonCell("Hello");

CheckBoxCell
复选框,将单元格数据在 true 和 false 之间切换。

var checkbox = new CheckBoxCell();
sheet["C1"] = new object[] { checkbox, "Auto destroy after 5 minutes." };
构造函数
| 构造函数 | 说明 |
|---|---|
CheckBoxCell() | 创建未选中的复选框 |
CheckBoxCell(bool initChecked) | 创建具有初始选中状态的复选框 |
属性
| 属性 | 类型 | 说明 |
|---|---|---|
IsChecked | bool | 获取或设置选中状态 |
获取和设置选中状态
// 通过单元格数据设置
sheet[1, 2] = true; // 选中
sheet[1, 2] = false; // 取消选中
// 通过单元格数据获取
bool isChecked = (sheet["C1"] as bool?) ?? false;
// 通过复选框实例获取/设置
checkbox.IsChecked = true;
bool state = checkbox.IsChecked;
事件
| 事件 | 说明 |
|---|---|
Click | 用户点击复选框时触发(空格键不触发) |
CheckChanged | 选中状态改变时触发(通过鼠标或键盘) |
checkbox.Click += (s, e) => { /* 处理点击 */ };
checkbox.CheckChanged += (s, e) =>
{
Console.WriteLine($"Checked: {checkbox.IsChecked}");
};
由于复选框会更新单元格数据,CellDataChanged 也会触发:
sheet.CellDataChanged += (s, e) =>
{
if (e.Cell.Position == new CellPosition("C1"))
Console.WriteLine("Checkbox changed: " + e.Cell.Data);
};
自定义绘制
覆写 OnContentPaint 以自定义复选框外观:
class MyCheckBox : CheckBoxCell
{
Image checkedImage, uncheckedImage;
public MyCheckBox()
{
checkedImage = Image.FromFile(@"...");
uncheckedImage = Image.FromFile(@"...");
}
protected override void OnContentPaint(CellDrawingContext dc)
{
dc.Graphics.DrawImage(
this.IsChecked ? checkedImage : uncheckedImage,
this.ContentBounds);
}
}

RadioButtonCell
单选按钮,继承自 CheckBoxCell。同组内的单选按钮互相切换。

var radio = new RadioButtonCell();
sheet["C3"] = radio;
RadioButtonGroup
分配共享的 RadioButtonGroup,使同一时间只能选中一个单选按钮:
var group = new RadioButtonGroup();
sheet[10, 2] = new object[,] {
{ new RadioButtonCell() { RadioGroup = group }, "Apple" },
{ new RadioButtonCell() { RadioGroup = group }, "Orange" },
{ new RadioButtonCell() { RadioGroup = group }, "Banana" },
};
RadioButtonGroup 成员
| 成员 | 类型 | 说明 |
|---|---|---|
RadioButtons | List<RadioButtonCell> | 此组中的所有单选按钮 |
AddRadioButton(cell) | 方法 | 手动将单选按钮添加到组中 |
Contains(cell) | 方法 | 检查单选按钮是否属于此组 |
属性
| 属性 | 类型 | 说明 |
|---|---|---|
RadioGroup | RadioButtonGroup | 此单选按钮所属的组 |
IsChecked | bool | 获取或设置选择状态(继承) |
事件
// Click 事件
radio.Click += (s, e) => { /* 处理 */ };
// 组中所有单选按钮的 CheckChanged 事件
group.RadioButtons.ForEach(rb =>
rb.CheckChanged += (s, e) =>
Console.WriteLine("Selected: " + sheet[rb.Cell.Row, rb.Cell.Column + 1]));
DropdownListCell
下拉列表,允许用户从项目列表中选择。

构造函数
| 构造函数 | 说明 |
|---|---|
DropdownListCell() | 空的下拉列表 |
DropdownListCell(params string[] candidates) | 带字符串项的下拉列表 |
DropdownListCell(IEnumerable<string> candidates) | 带字符串集合的下拉列表 |
DropdownListCell(ReferenceRange refRange) | 使用单元格范围作为数据源的下拉列表 |
var dropdown = new DropdownListCell(
"Apple", "Orange", "Banana", "Pear",
"Pumpkin", "Cherry", "Coconut"
);
sheet["B2"] = dropdown;
属性
| 属性 | 类型 | 说明 |
|---|---|---|
SelectedItem | object | 当前选中的项 |
SelectedIndex | int | 选中项的索引 |
事件
| 事件 | 说明 |
|---|---|
SelectedItemChanged | 选中项改变时触发 |
dropdown.SelectedItemChanged += (s, e) =>
{
Console.WriteLine("Selected: " + dropdown.SelectedItem);
};
选中项也会设置为单元格数据,因此 CellDataChanged 也会触发。
了解更多请参阅 下拉列表单元格。
ComboListCell
组合框,将文本输入框与下拉选择列表结合。支持输入时自动补全。
构造函数
| 构造函数 | 说明 |
|---|---|
ComboListCell() | 空的组合列表 |
ComboListCell(params string[] candidates) | 带字符串项 |
ComboListCell(IEnumerable<string> candidates) | 带字符串集合 |
ComboListCell(ReferenceRange refRange) | 使用单元格范围作为数据源 |
var combo = new ComboListCell("Apple", "Orange", "Banana");
sheet["B2"] = combo;
属性
| 属性 | 类型 | 说明 |
|---|---|---|
SelectedItem | object | 当前选中的项 |
SelectedIndex | int | 选中项的索引 |
EnableAutoCompletion | bool | 输入时启用自动补全(默认:true) |
AutoCompleteComparerator | Func<string, string, bool> | 自动补全的自定义比较函数 |
CandidationListSearchProvider | Func<object, IList<string>> | 候选列表的自定义搜索提供程序 |
事件
| 事件 | 说明 |
|---|---|
SelectedItemChanged | 选中项改变时触发 |
DropdownCell(基类)
DropdownCell 是所有下拉单元格类型的抽象基类。可以扩展它来创建自定义下拉控件。

属性
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
PullDownOnClick | bool | false | 点击单元格时打开下拉面板 |
DropdownButtonSize | RGSize | 16x16 | 下拉按钮的大小 |
DropdownButtonAutoHeight | bool | true | 自动调整按钮高度以匹配单元格 |
IsDropdown | bool | false | 下拉面板当前是否打开 |
DropdownPanelHeight | int | 200 | 下拉面板的高度 |
MinimumDropdownWidth | int | 40 | 下拉面板的最小宽度 |
MaximumDropdownWidth | int | 1200 | 下拉面板的最大宽度 |
DropdownControl | Control | null | 在下拉面板中显示的控件 |
DropdownButtonStyle | DropdownCellStyle | — | 下拉按钮的样式 |
方法
| 方法 | 说明 |
|---|---|
PushDown(bool forceCellEdit = true) | 打开下拉面板 |
PullUp() | 关闭下拉面板 |
事件
| 事件 | 说明 |
|---|---|
DropdownOpened | 下拉面板打开时触发 |
DropdownClosed | 下拉面板关闭时触发 |
请参阅 如何创建自定义下拉单元格 了解创建自定义下拉控件。
ProgressCell
显示水平进度条。单元格值(0–1)决定填充量。
sheet["B2"] = new ProgressCell();
sheet["B2"] = 0.7; // 70% 进度
属性
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
TopColor | SolidColor | LightSkyBlue | 进度条的顶部渐变色 |
BottomColor | SolidColor | SkyBlue | 进度条的底部渐变色 |
var progress = new ProgressCell
{
TopColor = SolidColor.LightGreen,
BottomColor = SolidColor.Green,
};
sheet["B2"] = progress;
sheet["B2"] = 0.5;
NegativeProgressCell
显示正值和负值的进度条。正值从中心向右延伸;负值从中心向左延伸。

sheet["B2"] = new NegativeProgressCell();
sheet["B2"] = -0.3; // 30% 负向进度
属性
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
PositiveColor | SolidColor | LightGreen | 正值颜色 |
NegativeColor | SolidColor | LightCoral | 负值颜色 |
LinearGradient | bool | true | 应用渐变阴影 |
DisplayCellText | bool | true | 显示单元格文本值 |
LimitedInsideCell | bool | true | 限制进度条在单元格边界内 |
HyperlinkCell
可点击的超链接。使用单元格数据作为显示文本和导航 URL。

// 点击时自动导航到 URL
sheet[1, 2] = new HyperlinkCell("http://www.google.com", true);
// 或分别设置 URL 和显示文本
sheet[1, 2] = new HyperlinkCell("http://www.google.com", false);
sheet[1, 2] = "Google";
构造函数
| 构造函数 | 说明 |
|---|---|
HyperlinkCell() | 启用自动导航的超链接 |
HyperlinkCell(string url) | 带 URL 和自动导航的超链接 |
HyperlinkCell(string url, bool autoNavigate) | 可配置自动导航的超链接 |
属性
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
LinkURL | string | null | 导航 URL |
AutoNavigate | bool | true | 点击时自动导航 |
LinkColor | SolidColor | Blue | 未访问链接的颜色 |
VisitedColor | SolidColor | Purple | 已访问链接的颜色 |
ActivateColor | SolidColor | Red | 链接被按下时的颜色 |
事件
| 事件 | 说明 |
|---|---|
Click | 链接被点击时触发(如果 AutoNavigate 为 true 则在导航之后) |
var link = new HyperlinkCell("http://myurl.com", false);
link.Click += (s, e) => { /* 自定义处理 */ };
sheet["A1"] = link;
方法
| 方法 | 说明 |
|---|---|
PerformClick() | 以编程方式模拟点击 |
ImageCell
在单元格中显示图片。

var image = Image.FromFile("photo.jpg");
sheet[2, 6] = new ImageCell(image);
构造函数
| 构造函数 | 说明 |
|---|---|
ImageCell() | 空的图片单元格 |
ImageCell(Image image) | 带指定图片的图片单元格 |
ImageCell(Image image, ImageCellViewMode viewMode) | 带视图模式的图片单元格 |
属性
| 属性 | 类型 | 说明 |
|---|---|---|
Image | Image | 要显示的图片 |
ViewMode | ImageCellViewMode | 图片的显示方式 |
ImageCellViewMode 枚举
| 值 | 说明 |
|---|---|
Stretch | 填充到单元格边界(默认)— 可能会变形 |
Zoom | 按比例缩放以适应单元格边界 |
Clip | 保持原始大小并裁剪到单元格边界 |
var imgCell = new ImageCell(img, ImageCellViewMode.Zoom);
sheet["F6"] = imgCell;
通过单元格对齐样式控制图片位置:
var cell = sheet.Cells["F6"];
cell.Style.HAlign = ReoGridHorAlign.Center;
cell.Style.VAlign = ReoGridVerAlign.Middle;
ImageButtonCell
显示图片的按钮。继承自 ButtonCell。

sheet["C3"] = new ImageButtonCell(Image.FromFile("Save-32.png"));
属性
| 属性 | 类型 | 说明 |
|---|---|---|
Image | Image | 按钮上显示的图片 |
继承 ButtonCell 的 Click 事件和 PerformClick() 方法。
DatePickerCell
带月历的下拉单元格,用于日期选择。仅 WinForms。

sheet["B2"] = new DatePickerCell();
选择的日期存储为单元格的数据。
注意:
DatePickerCell仅在 WinForms 版本中可用。对于 WPF,请参阅 如何创建日期选择器单元格。
ColumnDropdownListCell
使用列数据作为选择来源的下拉列表。仅 WinForms。
sheet["B2"] = new ColumnDropdownListCell();
单元格主体大小
单元格主体的大小由其父单元格决定,包括任何内边距样式。要使单元格主体更大,可以合并多个单元格:
sheet.MergeRange("B2:D4");
sheet["B2"] = new ButtonCell("Large Button");
平台可用性
| 单元格类型 | WinForms | WPF |
|---|---|---|
| ButtonCell | 是 | 是 |
| CheckBoxCell | 是 | 是 |
| RadioButtonCell | 是 | 是 |
| HyperlinkCell | 是 | 是 |
| ImageCell | 是 | 是 |
| ImageButtonCell | 是 | 是 |
| ProgressCell | 是 | 是 |
| NegativeProgressCell | 是 | 是 |
| DropdownCell | 是 | 是 |
| DropdownListCell | 是 | 是 |
| ComboListCell | 是 | 是 |
| ColumnDropdownListCell | 是 | 否 |
| DatePickerCell | 是 | 否 |
| 自定义单元格主体 | 是 | 是 |
演示项目
内置单元格类型的示例包含在 Demo 项目中。
WinForms:

WPF:

相关主题
- 自定义单元格 — 创建自定义单元格主体
- 下拉列表单元格 — 下拉列表详情
- 如何创建自定义下拉单元格 — 自定义下拉教程
- 如何创建日期选择器单元格 — WPF 日期选择器教程
- 单元格 — 单元格属性和数据








