【WinForm UI控件】表单控件

TableLayoutPanelEx 是一个功能强大的表格布局容器控件,在标准 TableLayoutPanel 基础上进行了大量增强,支持通过拖拽方式快速构建表单界面。提供网格线显示、表头行/列、单元格合并、控件对齐、行列尺寸精确控制等丰富功能,并内置设计时扩展属性支持,可在属性窗口直接配置子控件的位置和布局行为。

一、示例

二、文档

TableLayoutPanelEx 增强表格布局面板

控件名称

TableLayoutPanelEx

中文名称

增强表格布局面板

控件概述

TableLayoutPanelEx 是一个功能强大的表格布局容器控件,在标准 TableLayoutPanel 基础上进行了大量增强,支持通过拖拽方式快速构建表单界面。提供网格线显示、表头行/列、单元格合并、控件对齐、行列尺寸精确控制等丰富功能,并内置设计时扩展属性支持,可在属性窗口直接配置子控件的位置和布局行为。

主要特性

  • 行列控制:支持任意行列数配置,可精确设置每行高度和每列宽度
  • 表头支持:支持标题行(HeaderRow)和标题列(HeaderColumn),标题行可自动合并为一整行并显示标题文本
  • 单元格合并:支持 RowSpan(行合并)和 ColumnSpan(列合并),合并后的内部网格线自动隐藏
  • 控件对齐:支持 9 种对齐方式(Stretch=false 时生效),包括左上、居中、右下等
  • 拉伸控制:每个子控件可独立设置是否拉伸填满单元格,不拉伸时保持原始尺寸
  • 表格对齐:当表格尺寸小于控件尺寸时,支持 9 种表格在控件内的对齐方式
  • 网格线显示:支持显示/隐藏网格线,可自定义网格线颜色和宽度
  • 独立边框:控件外边框与表格网格线颜色独立设置,边框默认宽度为 0(无边框)
  • 设计时支持:通过 IExtenderProvider 为子控件提供扩展属性,在属性窗口直接设置行号、列号、合并、拉伸、对齐

属性说明

布局属性

属性名 类型 默认值 说明
ColumnCount int 2 列数
RowCount int 4 行数
ColumnWidths int[] null 列宽度数组(像素),为空时自动均分。0 表示自动分配剩余宽度示例:new int[]{90,0,90,0} 表示第1、3列固定90像素,第2、4列自动平分剩余宽度
RowHeights int[] null 行高度数组(像素),为空时自动均分。数组中的 0 会被替换为 35示例:new int[]{35,35,35,60}
CellPadding Padding 4,4,4,4 单元格内边距,控件与单元格边框之间的间隙
Padding Padding 4,4,4,4 控件内边距,表格与控件边界之间的间隙。设置后表格四周会留出空白区域,避免边框贴边
TableAlignment ContentAlignment TopLeft 表格在控件内的对齐方式。当表格总尺寸小于控件尺寸时生效

外观属性

属性名 类型 默认值 说明
ShowGridLines bool true 是否显示网格线
GridLineColor Color #D9D9D9 表格内部网格线颜色
GridLineWidth int 1 表格内部网格线宽度(像素)
BorderColor Color Empty 控件外边框颜色。Color.Empty 表示无边框
BorderWidth int 0 控件外边框宽度(像素)。默认 0 表示无边框
BorderRadius int 8 控件外边框圆角半径
TableCornerRadius int 0 表格圆角半径。大于0时表格四个角显示为圆角,与控件外边框独立

表头属性

属性名 类型 默认值 说明
HeaderRow bool true 是否显示表头行。设为 true 时标题行自动合并为一整行
HeaderColumn bool false 是否显示表头列
HeaderBackColor Color #F5F5F5 表头背景色
HeaderForeColor Color #333333 表头前景色(文字颜色)
TitleText string "" 标题行文本。仅在 HeaderRow=true 时显示

子控件扩展属性(单元格布局)

选中 TableLayoutPanelEx 内的子控件后,属性窗口会显示 "单元格布局" 分类,包含以下扩展属性:

属性名 类型 默认值 说明
Row int 0 行索引(从 0 开始),0 表示第 1 行
Column int 0 列索引(从 0 开始),0 表示第 1 列
RowSpan int 1 行合并范围。设为 2 表示占据当前行和下一行
ColumnSpan int 1 列合并范围。设为 2 表示占据当前列和下一列;设为 4 可跨整行
Stretch bool true 是否拉伸填满单元格。设为 false 时控件保持原始尺寸
Alignment ContentAlignment MiddleLeft 控件在单元格中的对齐方式。仅在 Stretch=false 时生效

公共方法

方法名 说明 示例
SetRowHeight(int rowIndex, int height) 设置指定行高度。rowIndex 从 0 开始,height <= 0 时自动设为 35 SetRowHeight(0, 50) 设置第 1 行高 50 像素
SetColumnWidth(int columnIndex, int width) 设置指定列宽度。columnIndex 从 0 开始,width = 0 时自动分配剩余宽度 SetColumnWidth(2, 0) 设置第 3 列为自适应宽度
GetRowHeight(int rowIndex) 获取指定行高度 GetRowHeight(0) 返回第 1 行高度
GetColumnWidth(int columnIndex) 获取指定列宽度 GetColumnWidth(0) 返回第 1 列宽度
GetCellBounds(int row, int column) 获取指定单元格的矩形区域 GetCellBounds(0, 0) 返回第 1 行第 1 列的矩形
SetRow(Control, int) 设置子控件所在行 SetRow(button1, 2)
SetColumn(Control, int) 设置子控件所在列 SetColumn(button1, 1)
SetRowSpan(Control, int) 设置子控件行合并范围 SetRowSpan(button1, 2)
SetColumnSpan(Control, int) 设置子控件列合并范围 SetColumnSpan(button1, 2) 跨 2 列
SetStretch(Control, bool) 设置子控件是否拉伸 SetStretch(button1, false)
SetAlignment(Control, ContentAlignment) 设置子控件对齐方式 SetAlignment(button1, ContentAlignment.MiddleCenter)

事件

事件名 参数 说明
CellClick CellClickEventArgs 单击单元格时触发。参数包含 Row(行索引)和 Column(列索引)
PropertyChanged PropertyChangedEventArgs 属性值变更时触发(INotifyPropertyChanged 接口)

代码示例

基础用法

// 设置行列数
tableLayoutPanelEx1.RowCount = 5;
tableLayoutPanelEx1.ColumnCount = 4;

// 设置标题
tableLayoutPanelEx1.TitleText = "用户表";
tableLayoutPanelEx1.HeaderRow = true;

// 设置列宽
tableLayoutPanelEx1.SetColumnWidth(0, 80);   // 第1列 80像素
tableLayoutPanelEx1.SetColumnWidth(1, 200);  // 第2列 200像素
tableLayoutPanelEx1.SetColumnWidth(2, 80);   // 第3列 80像素
tableLayoutPanelEx1.SetColumnWidth(3, 200);  // 第4列 200像素

// 设置行高
tableLayoutPanelEx1.SetRowHeight(0, 40);  // 标题行
tableLayoutPanelEx1.SetRowHeight(1, 35);
tableLayoutPanelEx1.SetRowHeight(2, 35);
tableLayoutPanelEx1.SetRowHeight(3, 35);
tableLayoutPanelEx1.SetRowHeight(4, 50);  // 按钮行

单元格合并示例

// 将 buttonEx1 放在第5行第1列,并跨2列
tableLayoutPanelEx1.SetRow(buttonEx1, 4);
tableLayoutPanelEx1.SetColumn(buttonEx1, 0);
tableLayoutPanelEx1.SetColumnSpan(buttonEx1, 2);
tableLayoutPanelEx1.SetStretch(buttonEx1, false);
tableLayoutPanelEx1.SetAlignment(buttonEx1, ContentAlignment.MiddleCenter);

// 将 buttonEx2 放在第5行第3列,并跨2列
tableLayoutPanelEx1.SetRow(buttonEx2, 4);
tableLayoutPanelEx1.SetColumn(buttonEx2, 2);
tableLayoutPanelEx1.SetColumnSpan(buttonEx2, 2);
tableLayoutPanelEx1.SetStretch(buttonEx2, false);
tableLayoutPanelEx1.SetAlignment(buttonEx2, ContentAlignment.MiddleCenter);

自适应列宽(固定+自动分配)

// 4列表格,第1列和第3列固定90像素,第2列和第4列自动平分剩余宽度
tableLayoutPanelEx1.ColumnCount = 4;
tableLayoutPanelEx1.ColumnWidths = new int[] { 90, 0, 90, 0 };

// 若控件总宽度为800,Padding为4(左右各4像素)
// 有效宽度 = 800 - 4 - 4 = 792
// 剩余宽度 = 792 - 90*2 = 612
// 第2列和第4列宽度 = 612 / 2 = 306
// 最终列宽:90, 306, 90, 306

使用 Padding 避免表格边框贴边

// 设置控件内边距,让表格四周留出空白区域
tableLayoutPanelEx1.Padding = new Padding(8);

// 此时表格的左边距为8像素,右边距也为8像素
// 表格有效总宽度 = 控件宽度 - Padding.Left - Padding.Right
// 即使表格网格线延伸到边界,也不会与控件外边框重合

表格圆角

// 设置表格四个角为圆角,与控件外边框独立
tableLayoutPanelEx1.TableCornerRadius = 6;

// 配合 Padding 使用,圆角效果更佳
tableLayoutPanelEx1.Padding = new Padding(8);

表格在控件内居中

// 当表格总尺寸小于控件尺寸时,表格居中显示
tableLayoutPanelEx1.TableAlignment = ContentAlignment.MiddleCenter;

单元格点击事件

private void tableLayoutPanelEx1_CellClick(object sender, CellClickEventArgs e)
{
    MessageBox.Show($"点击了第 {e.Row + 1} 行,第 {e.Column + 1} 列");
}

注意事项

  1. 行号列号从 0 开始:所有行索引和列索引均从 0 开始,0 表示第 1 行/列
  2. HeaderRow 自动合并:当 HeaderRow=true 时,标题行自动合并为一整行,不显示内部竖线
  3. Stretch=false 保持原始尺寸:设置 Stretch=false 后,控件会保持原始尺寸(设计时的大小),按 Alignment 属性在单元格内对齐
  4. 单元格合并内部格线自动隐藏:设置 RowSpan>1 或 ColumnSpan>1 后,合并范围内的内部网格线会自动隐藏
  5. ColumnWidths 自适应列宽:数组中的 0 表示自动分配剩余宽度。可通过属性窗口直接编辑数组,未设置的列/行会自动均分剩余空间。例如 new int[]{90,0,90,0} 表示第1、3列固定90像素,第2、4列自动平分剩余宽度
  6. Padding 控件内边距:默认值为 4 像素,控制表格与控件边界之间的间隙。修改 Padding 后会自动重新布局,确保表格四周留出空白区域,避免边框贴边或被截断
  7. 控件外边框与网格线分离:BorderColor/BorderWidth 控制控件外边框,GridLineColor/GridLineWidth 控制表格内部网格线,两者互不影响
  8. 有效总宽度计算:表格的实际可用宽度 = 控件宽度 - Padding.Left - Padding.Right。设置 ColumnWidths 时,系统会自动基于此有效宽度计算自适应列的宽度