摘自:http://www.cnblogs.com/ASPnet_yuan/archive/2010/12/22/Table.html
【摘要】: 在信息查询、统计等方面, 表中的单元格相同部分适当合并, 会使表中数据非常直观。本文讨论了ASP.NET环境下, 使用C# 实现单元格动态合并技术, 该方案对其它应用也有重要意义。
【关键词】: ASP.NET, 合并单元格, Table,Web 控件
一、引言
Table 控件可以用给定的静态内容在设计时生成表, 但Table 控件的威力通常在用动态内容以编程方式生成表时才会体现出来。Table 控件允许生成HTML 表并以直接方式指定其属性。Table 类主要由控件开发人员使用。
所有的Web 控件都有两个基本属性, 第一个属性是runat ="server", 它告诉ASP.NET 在服务器上处理控件, 并为控件执行所有的ASP.NET 功能, 包括状态的创建。第二个属性是ID, 指明该控件的唯一标识代号, 以便在代码中操纵该控件。
Table 控件主要由3 个组件组成:Table、TableRow和TableCell。
二、动态创建表
动态地创建一个表一般包含三个步骤:
( 1) 在.aspx 文件中, 在<body></body>里用一个asp 标签创建Table1 控件, Table1 就是一个对象。
<body>
<form id="Form1" method="post" runat="server">
<asp:Table id="Table1" runat="server"> </asp:Table>
</body>
Table 的具体生成可在<script></script>中通过函数写在.aspx文件中完成, 也可直接写在.cs 文件中。在具体生成上根据如下过程的:
( 2) 创建表格行对象TableRow(), 并向表中添加该行, 根据需要设置表格行的相关属性。
( 3) 创建表格单元格对象TableCell(), 并向表行中添加该单元格, 根据需要设置单元格的相关属性。
( 4) 对表中的各行重复(2)(3)过程。
实现方法的核心代码如下:
private void DrawTable (ref Table table, ref int seed)
{
TableRow r ; // 表格行对象
TableCell c ; // 表格单元格对象
for(int k=0; k<10; k++) // 行数控制
{
int s = 0; // 列标识变量
r = new TableRow(); table.Rows.Add(r); // 创建行
// 第0 列
c = new TableCell(); r.Cells.Add(c); // 创建列
c.ID = ProduceID(ref seed, s++);
c.Text = k.ToString(); // 第0 列内容
// 第1 列
c = new TableCell(); r.Cells.Add(c); // 创建列
c.ID = ProduceID(ref seed, s++);
c.Text = k.ToString(); // 第1 列内容
}
}
上述创建的是一个表格的表体的结构, 其内容根据具体需要可从数据库中获得。
三、表格标题行的创建与单元格合并
实际上, 表格标题行是按行构成的。如下面的示例表格中"院系"、"专业"、"班级"、"招生"和"备注"是第0 行, 而"人数"和"女生"是第1 行。其中"院系"、"业"、"班级"和"备注"占2 行, "招生"占2 列。
单元格合并主要用到单元格的RowSpan 和ColumnSpan 两个属性。实现示例表格标题行的核心代码如下:
private void SetTableHead(Table table, ref int seed)
{ // 第0 行
TableRow r = new TableRow(); table.Rows.Add(r);
TableHeaderCell h; // 标题行单元格对象
string[] sa1 = {"院系", "专业", "班级"};
for (int col = 0; col < 3; col++)
{
h = new TableHeaderCell(); r.Cells.Add(h); // 创建列
h.RowSpan = 2; // 占2 行
h.ID = ProduceID(ref seed, col);
h.Text = sa1[col];
}
h = new TableHeaderCell(); row1.Cells.Add(h);
h.ColumnSpan = 2; // 占2 列
h.Text = "招生";
h = new TableHeaderCell(); row1.Cells.Add(h);
h.RowSpan = 2; // 占2 行
h.Text = "备注";
// 第1 行
r = new TableRow(); table.Rows.Add(r); // 创建行
h = new TableHeaderCell(); r.Cells.Add(h); // 创建列
h.Text = "人数";
h = new TableHeaderCell(); r.Cells.Add(h);
h.Text = "女生";
}
四、表体单元格合并
由于表体中数据具有动态性的特点, 其纵向合并方法, 一般是逐行判断要合并的单元格里的值是否和上一行同列的相同,要是相同的话就合并, 不同的话就接着判断。
该方法的核心代码如下:
private void ColMerge(ref Table table, int col, int startRow)
{
int rowsCount = table.Rows.Count;
if (startRow >= rowsCount) return; // 超界返回
int rSpan = 0; //单元格跨越的行数
int s = startRow; //起始行
string text1 = table.Rows[startRow].Cells[col].Text;
for (int r = startRow; r < rowsCount; r++)
{
string text2 = GetCellByID(table.Rows[r], col).Text;
if (text1.Equals(text2))
{
rSpan++;
TableCell cell1 = GetCellByID(table.Rows[r], col);
if(r! =s) table.Rows[r].Cells.Remove(cell1); //移除
}
else
{
GetCellByID(table.Rows[s], col).RowSpan=rSpan;
rSpan = 0;
s = r- - ;
text1 = text2;
}
}
GetCellByID(table.Rows[s], col).RowSpan=rSpan;
}
五、调用
private int m_Seed = 0; //
private void Page_Load(object sender, System.EventArgs e)
{
this.SetTableHead(Table1, ref m_Seed); // 标题行
this.DrawTable(ref Table1, ref m_Seed); // 表体
ColMerge(ref table, 0, 1); //从第1 行起合并第0 列
}
分享到:
相关推荐
TABLE控件单元格的动态合并技术TABLE控件单元格的动态合并技术
aspose.words 控件可以方便的出来word文档,通过在word模板中定义书签,可以在指定的位置插入内容,如果需要在word中插入表格,并且表格中含有多行行头,需要合并单元时,就稍微麻烦一些,必须要注意设置单元格的...
解决方案,创建Table控件处理类,代码如下: 代码如下: /// 表格控件相关操作类 /// </summary> public static class aspTable { /// 合并行 /// </summary> /// 版权信息:http://www.qqextra.com,...
winform使用Microsoft.Office.Interop.Excel读取带有合并单元格的Excel的demo,Excel版本不限,可以是.xls可以是.xlsx版本。本程序采用webbrowser显示读取的数据,使用bootstrap的css样式美化table表格,使用Json...
日常开发中,经常遇到表格里需要自动合并单元格,考虑到写服务器控件比较消耗性能,因些还是把这种工作交给客户端Javascript去做吧,基于习惯用jquery框架,所以封装了一个Jquery插件。
c#合并表头合并单元格,就是像Table控件那像合并一表头
但是,课程表的显示可不是这么简单,它需要将普通记录继续加工,需要根据记录中具体的数据来确定数据需要显示在哪一行、哪一列,而且需要根据课程开始时间和结束时间动态合并单元格,最后才是数据的显示。...
类似于Excel的表格控件,可以实现编辑Table中的内容,添加行、删除行、合并单元格等功能。
CellSpanTable - 合并单元格,支持单元格的合并功能 CellStyleTable - 多样式单元格,支持每一个单元格自定义风格 JideTable -自动监听表格单元格编辑操作比如在单元格开始编辑之前或者单元格结束编辑之前),支持...
合并单元格 操作所有的打印选项 选择页面大小,设置边距 设置标题和页脚,包括格式码。 定义打印区域 设置分页符 XLSReadWriteII完全支持Unicode 所有的字符型都是宽字符型。你完全不必担心非英语字符。 ...
1.6 修正了当有合并单元格时,锁定单元格错位的问题,修正了表格行数较多时的性能问题 1.7 表格单元格可以不指定宽度(锁定时,取实际的单元格宽度),当单元格的左右两边的borderWidth不一样时,会有一些错位 ...
控件使用 1、鼠标经过行的时候改变该行的样式,鼠标离开行的时候恢复该行的样式 使用方法(设置属性): MouseOverCssClass - 鼠标经过行时行的 CSS 类名 2、对多个字段进行复合排序;升序、降序的排序状态提示 ...
1.6 修正了当有合并单元格时,锁定单元格错位的问题,修正了表格行数较多时的性能问题 1.7 表格单元格可以不指定宽度(锁定时,取实际的单元格宽度),当单元格的左右两边的borderWidth不一样时,会有一些错位 若...
合并单元格 操作所有的打印选项 选择页面大小,设置边距 设置标题和页脚,包括格式码。 定义打印区域 设置分页符 XLSReadWriteII完全支持Unicode 所有的字符型都是宽字符型。你完全不必担心非英语字符。 控件...
106 <br>0175 如何检索指定条件数组中的元素 107 <br>0176 如何动态改变数组长度 108 <br>0177 如何反转数组中元素的顺序 108 <br>0178 如何排序数组中的元素的顺序 109 <br>0179 如何创建...
•合并单元格 操作所有的打印选项 •选择页面大小,设置边距 •设置标题和页脚,包括格式码。 •定义打印区域 •设置分页符 XLSReadWriteII完全支持Unicode 所有的字符型都是宽字符型。你完全不必担心非英语...
我们的表格具有各种丰富的特性,包括一些高级特性,如单元格合并(非常适合于显示主/从关系),打印,图像,分类,搜索以及JSuite的编辑组件对内部单元格验证的内置支持。 Trees组件 为网站导航和Java应用程序...
9.22 动态生成包含合并单元格的表格 9.23 用键盘上下键实现表格行的上下选择 9.24 用JavaScript隐藏或显示表格列 9.25 滚动的表格 9.26 交换表的行 9.27 动态拖放表格的宽度 9.28 可输入内容的表格 9.29 可以分级的...