一、Table 控件的属性:

1. CellPadding属性

用于设置表中单元格的边框和内容之间的距离(以像素为单位)。默认为-1(未设置)。

2. CellSpacing属性

用于设置表中单元格之间的距离(以像素为单位)。默认为-1(未设置)。

3. Rows 属性

用于获取表行的集合。主要属性和方法如下:

  • Count属性:表示Rows集合的元素个数(即表的行数);
  • Add方法:用于添加一个新的TableRow对象(即向表中添加一行);
  • AddAt方法:用于在指定的位置添加一个新的TableRow对象(即向表中插入一行);
  • Remove方法:用于移除一个TableRow对象(即从表中移除一行);
  • RemoveAt方法:用于移除指定索引值的TableRow对象(即从表中移除指定索引值的行);
  • Clear方法:清除Rows集合中的所有元素(即清除表中的所有行)。可用Row(i)表示Rows集合中的第i个元素(从0算起)

4. GridLines属性

用于指定Table控件中显示的格线样式,可能的样式值有:

  • None:不显示单元格边框;
  • Horizontal:只显示单元格的水平框;
  • Vertical:只显示单元格的垂直边框;
  • Both:同时显示水平边框和垂直边框。

5. HorizontalAlign属性

用于设置表中内容的水平对齐方式。可能的对齐方式如下:

  • Center:居中;
  • Left:左对齐;
  • NoSet:未设置;
  • Right:右对齐;
  • Justify:表的内容均可展开,与左右边距对齐。

二、Tablelrow对象的主要属性

1. Cells属性

表示表行中单元格的集合。Cell集合的主要属性和方法如下:

  • Count属性:表示Cells集合的元素个数(即列数);
  • Add方法:用于添加一个新的TableCell对象(即向表中添加一个单元格);
  • AddAt方法:用于在指定的位置添加一个新的TableCell对象(即向表行中插入一个单元格);
  • Remove方法:用于移除一个TableCell对象(即从表行中移除一个单元格);
  • RemoveAt方法:用于移除指定索引值的TableCell对象(即从表行中移除指定索引值的单元格);
  • Clear方法:清除Cells集合中的所有元素(即清除表行中的所有单元格);

可用Cells(j)表示Cells集合中的第j个元素(从0算起)。

2. HorizontalAlign属性

用于设置行内容的水平对齐方式。可能的对齐方式值同Table控件的HorizontalAlign属性值。

3. VerticalAlign属性

用于指定行内容的垂直对齐方式。可能的对齐方式值有:

  • NotSet:未设置对齐方式;
  • Top:行内容与行的上边缘对齐;
  • Middle:行内容的垂直方向居中对齐;
  • Bottom:行内容与行的下边缘对齐。

三、TableCell对齐的主要属性

1. ColumnSpan属性

表示该单元格在呈现出的表中所跨越的列数。例如,如果ColumnSpan属性值为2,表示该单元格在Table控件中占两列。

2. HorizontalAlign属性

用于设置列内容的水平对齐方式,其属性值及含义同Table控件的HorizaontalAlign属性。

3. RowSpan属性

表示该单元格在呈现出的表中所跨越的行数。例如,如果RowSpan属性值为2,表示该单元格在Table控件中占两行。

4. VerticalAlign属性

用于指定列内容的垂直对齐方式,其属性值及含义同TableRow对象的HorizontalAlign属性值类似,不同的是它指定列内容为垂直对齐方式。

5. Wrap属性

属性值决定是否允许单元格内容在单元格内换行。如果对允许换行,则属性值为True,否则为False。

四、单元格动态合并

1. 引言

Table 控件可以用给定的静态内容在设计时生成表, 但Table 控件的威力通常在用动态内容以编程方式生成表时才会体现出来。Table 控件允许生成HTML 表并以直接方式指定其属性。Table 类主要由控件开发人员使用。
所有的Web 控件都有两个基本属性, 第一个属性是runat =”server”, 它告诉ASP.NET 在服务器上处理控件, 并为控件执行所有的ASP.NET 功能, 包括状态的创建。第二个属性是ID, 指明该控件的唯一标识代号, 以便在代码中操纵该控件。
Table 控件主要由3 个组件组成:Table、TableRow和TableCell。

2. 动态创建表

动态地创建一个表一般包含三个步骤:
( 1) 在.aspx 文件中, 在里用一个asp 标签创建Table1 控件, Table1 就是一个对象。
  1. <body>
  2. <form id="Form1" method="post" runat="server">
  3. <asp:Table id="Table1" runat="server"> </asp:Table>
  4. </body>
Table 的具体生成可在中通过函数写在.aspx文件中完成, 也可直接写在.cs 文件中。在具体生成上根据如下过程的:
( 2) 创建表格行对象TableRow(), 并向表中添加该行, 根据需要设置表格行的相关属性。
( 3) 创建表格单元格对象TableCell(), 并向表行中添加该单元格, 根据需要设置单元格的相关属性。
( 4) 对表中的各行重复(2)(3)过程。
实现方法的核心代码如下:
  1. private void DrawTable (ref Table table, ref int seed)
  2. {
  3. TableRow r ; // 表格行对象
  4. TableCell c ; // 表格单元格对象
  5. for(int k=0; k<10; k++) // 行数控制
  6. {
  7. int s = 0; // 列标识变量
  8. r = new TableRow(); table.Rows.Add(r); // 创建行
  9. // 第0 列
  10. c = new TableCell(); r.Cells.Add(c); // 创建列
  11. c.ID = ProduceID(ref seed, s++);
  12. c.Text = k.ToString(); // 第0 列内容
  13. // 第1 列
  14. c = new TableCell(); r.Cells.Add(c); // 创建列
  15. c.ID = ProduceID(ref seed, s++);
  16. c.Text = k.ToString(); // 第1 列内容
  17. }
  18. }
上述创建的是一个表格的表体的结构, 其内容根据具体需要可从数据库中获得。

3. 表格标题行的创建与单元格合并

实际上, 表格标题行是按行构成的。如下面的示例表格中”院系”、”专业”、”班级”、”招生”和”备注”是第0 行, 而”人数”和”女生”是第1 行。其中”院系”、”业”、”班级”和”备注”占2 行, “招生”占2 列。
单元格合并主要用到单元格的RowSpan 和ColumnSpan 两个属性。实现示例表格标题行的核心代码如下:
  1. private void SetTableHead(Table table, ref int seed)
  2. { // 第0 行
  3. TableRow r = new TableRow(); table.Rows.Add(r);
  4. TableHeaderCell h; // 标题行单元格对象
  5. string[] sa1 = {"院系", "专业", "班级"};
  6. for (int col = 0; col < 3; col++)
  7. {
  8. h = new TableHeaderCell(); r.Cells.Add(h); // 创建列
  9. h.RowSpan = 2; // 占2 行
  10. h.ID = ProduceID(ref seed, col);
  11. h.Text = sa1[col];
  12. }
  13. h = new TableHeaderCell(); row1.Cells.Add(h);
  14. h.ColumnSpan = 2; // 占2 列
  15. h.Text = "招生";
  16. h = new TableHeaderCell(); row1.Cells.Add(h);
  17. h.RowSpan = 2; // 占2 行
  18. h.Text = "备注";
  19. // 第1 行
  20. r = new TableRow(); table.Rows.Add(r); // 创建行
  21. h = new TableHeaderCell(); r.Cells.Add(h); // 创建列
  22. h.Text = "人数";
  23. h = new TableHeaderCell(); r.Cells.Add(h);
  24. h.Text = "女生";
  25. }

4. 表体单元格合并

由于表体中数据具有动态性的特点, 其纵向合并方法, 一般是逐行判断要合并的单元格里的值是否和上一行同列的相同,要是相同的话就合并, 不同的话就接着判断。
该方法的核心代码如下:
  1. private void ColMerge(ref Table table, int col, int startRow)
  2. {
  3. int rowsCount = table.Rows.Count;
  4. if (startRow >= rowsCount) return; // 超界返回
  5. int rSpan = 0; //单元格跨越的行数
  6. int s = startRow; //起始行
  7. string text1 = table.Rows[startRow].Cells[col].Text;
  8. for (int r = startRow; r < rowsCount; r++)
  9. {
  10. string text2 = GetCellByID(table.Rows[r], col).Text;
  11. if (text1.Equals(text2))
  12. {
  13. rSpan++;
  14. TableCell cell1 = GetCellByID(table.Rows[r], col);
  15. if(r! =s) table.Rows[r].Cells.Remove(cell1); //移除
  16. }
  17. else
  18. {
  19. GetCellByID(table.Rows[s], col).RowSpan=rSpan;
  20. rSpan = 0;
  21. s = r- - ;
  22. text1 = text2;
  23. }
  24. }
  25. GetCellByID(table.Rows[s], col).RowSpan=rSpan;
  26. }

5. 调用

  1. private int m_Seed = 0; //
  2. private void Page_Load(object sender, System.EventArgs e)
  3. {
  4. this.SetTableHead(Table1, ref m_Seed); // 标题行
  5. this.DrawTable(ref Table1, ref m_Seed); // 表体
  6. ColMerge(ref table, 0, 1); //从第1 行起合并第0 列
  7. }

6. 表格控件相关操作类

  1. public static class aspTable
  2. {
  3. /// <summary>合并行
  4. /// </summary>
  5. /// <remarks>版权信息:http://www.qqextra.com,http://t.qq.com/ls_man,http://blog.csdn.net/ls_man 2013-06-21 14:20:36</remarks>
  6. /// <param name="tbl">Table</param>
  7. /// <param name="startRow">起始行</param>
  8. /// <param name="endRow">结束行</param>
  9. /// <param name="colIndex">要合并的列索引</param>
  10. public static void SetRowSpan(Table tbl, int startRow, int endRow, int colIndex)
  11. {
  12. int countRowSpan = 0;
  13. int spanRow = startRow;
  14. string spanText = tbl.Rows[startRow].Cells[colIndex].Text;
  15. for (int rowIndex = startRow; rowIndex <= endRow; rowIndex++)
  16. {
  17. string currentText = tbl.Rows[rowIndex].Cells[colIndex].Text;
  18. //内容是否相同
  19. if (currentText == spanText)
  20. {
  21. countRowSpan++;
  22. //移除被合并的单元格
  23. if (rowIndex != spanRow)
  24. {
  25. tbl.Rows[rowIndex].Cells.RemoveAt(colIndex);
  26. }
  27. }
  28. else
  29. {
  30. //合并
  31. tbl.Rows[spanRow].Cells[colIndex].RowSpan = countRowSpan;
  32. //从此行再向下比较(重置)
  33. countRowSpan = 0;
  34. spanRow = rowIndex--;
  35. spanText = currentText;
  36. }
  37. }
  38. //合并最后一项
  39. tbl.Rows[spanRow].Cells[colIndex].RowSpan = countRowSpan;
  40. }
  41. /// <summary>合并行,支持多列
  42. /// </summary>
  43. /// <remarks><span style="font-family: Arial, Helvetica, sans-serif;">版权信息:http://www.qqextra.com,http://t.qq.com/ls_man,http://blog.csdn.net/ls_man</span><span style="font-family: Arial, Helvetica, sans-serif;"> 2013-06-21 15:24:34</remarks></span>
  44. /// <param name="tbl">Table</param>
  45. /// <param name="startRow">起始行</param>
  46. /// <param name="endRow">结束行</param>
  47. /// <param name="colIndex">要合并的列索引</param>
  48. public static void SetRowSpans(Table tbl, int startRow, int endRow, params int[] colIndexs)
  49. {
  50. ArrayList al = new ArrayList(colIndexs);
  51. al.Sort();
  52. for (int i = al.Count - 1; i >= 0; i--)
  53. {
  54. SetRowSpan(tbl, startRow, endRow, (int)al[i]);
  55. }
  56. }
  57. }
需要注意的几点,起始行一般设置为1,因为0是标题行;结束行一般设置为Table的总行数-1即可(最后一行)。

五、实例

以上是Table 控件的属性介绍,下面是我的一个实例:

1.实例一

1. 添加table的表头:
  1. /// <summary>
  2. /// 添加表单表头
  3. /// </summary>
  4. /// <param name="tb">表格</param>
  5. /// <param name="title">标题数组</param>
  6. /// <param name="BorderColor">边框颜色</param>
  7. /// <param name="BorderWidth">边框宽度</param>
  8. /// <param name="Bold">是否粗体</param>
  9. /// <param name="Size">字体大小</param>
  10. /// <param name="Width">单元格宽度</param>
  11. /// <param name="RomBackColor">行背景颜色</param>
  12. public void AddTableHeader(ref Table tb, string[] title, System.Drawing.Color BorderColor, int BorderWidth, bool Bold, int Size, int[] Width, System.Drawing.Color RomBackColor)
  13. {
  14. TableHeaderRow tHeadRow = new TableHeaderRow();
  15. for (int i = 0; i < title.Count(); i++)
  16. {
  17. TableHeaderCell tHeadCell1 = new TableHeaderCell();
  18. tHeadCell1.Text = title[i].ToString();
  19. tHeadCell1.BorderColor = System.Drawing.Color.Black;
  20. tHeadCell1.BorderWidth = 1;
  21. tHeadCell1.Font.Bold = true;
  22. tHeadCell1.Font.Size = 15;
  23. tHeadCell1.Width = Width[i];
  24. tHeadRow.Cells.Add(tHeadCell1);
  25. }
  26. tHeadRow.BackColor = RomBackColor;
  27. tb.Rows.Add(tHeadRow);
  28. }
2. 向table添加一行
  1. /// <summary>
  2. /// 向指定的表格添加行数据
  3. /// </summary>
  4. /// <param name="tb">表格</param>
  5. /// <param name="dt">需要添加的行的数据</param>
  6. /// <param name="BorderColor">边框颜色</param>
  7. /// <param name="windth">边框宽度</param>
  8. /// <param name="ha">左右对齐格式</param>
  9. /// <param name="RowSpan">跨行数</param>
  10. /// <param name="SpanCell">设置跨越的单元格</param>
  11. public void AddTableRow(ref Table tb, string[] arr, System.Drawing.Color BackColor, int BorderWidth, HorizontalAlign ha, int RowSpan, string SpanCell)
  12. {
  13. string[] str=null;
  14. if (!string.IsNullOrEmpty(SpanCell))
  15. {
  16. str = SpanCell.Split(',');
  17. }
  18. TableRow newTr = new TableRow();
  19. for (int i = 0; i < arr.Count(); i++)
  20. {
  21. TableCell newTC1 = new TableCell();
  22. newTC1.Text = arr[i].ToString();
  23. newTC1.BorderWidth = BorderWidth;
  24. if (str != null)
  25. {
  26. for (int j = 0; j < str.Count(); j++)
  27. {
  28. if ((i + 1) == Convert.ToInt32(str[j]))
  29. {
  30. newTC1.RowSpan = RowSpan;
  31. newTC1.BackColor = System.Drawing.Color.White;
  32. break;
  33. }
  34. else
  35. newTC1.BackColor = BackColor;
  36. }
  37. }
  38. else { newTC1.BackColor = BackColor; }
  39. newTC1.HorizontalAlign = ha;
  40. newTr.Cells.Add(newTC1);
  41. }
  42. tb.Rows.Add(newTr);
  43. }
3. 调用方法:
  1. tbBuild.AddTableRow(ref tbAnswerCountRpt, arr, System.Drawing.Color.GreenYellow, 1, HorizontalAlign.Center, Convert.ToInt32(dt.Rows[i]["anscount"]), "1,2");
4. 结果

ASP | Table - 图1

2. 实例二

在aspx.cs中添加以下代码实现动态创建
  1. protected void Page_Load(object sender, EventArgs e)
  2. {
  3. string[] name = {"妹妹","哥哥"};
  4. string[] number = { "201924111", "201924112" };
  5. for (int i= 1; i<=2; i++)
  6. {
  7. TableRow row = new TableRow();//建立一个行对象
  8. TableCell cellNumber = new TableCell(); //建立第一个单元格对象
  9. TableCell cellName = new TableCell();
  10. TableCell cellInput = new TableCell();
  11. cellNumber.Text = number[i - 1];
  12. cellName.Text = name[i - 1];
  13. TextBox txtInput = new TextBox();//建立一个文本框对象
  14. cellInput.Controls.Add(txtInput);//添加文本框对象到第三个单元格中
  15. row.Cells.Add(cellNumber);//添加第一个单元格到行对象
  16. row.Cells.Add(cellName);
  17. row.Cells.Add(cellInput);
  18. tblScore.Rows.Add(row);//添加行对象到表格对象
  19. }
  20. }
aspx完整代码
  1. <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Table.aspx.cs" Inherits="Chap2_Table" %>
  2. <!DOCTYPE html>
  3. <html xmlns="http://www.w3.org/1999/xhtml">
  4. <head runat="server">
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  6. <title></title>
  7. </head>
  8. <body>
  9. <form id="form1" runat="server">
  10. <div>
  11. <asp:Table ID="tblScore" runat="server">
  12. <asp:TableRow runat="server">
  13. <asp:TableCell runat="server">学号</asp:TableCell>
  14. <asp:TableCell runat="server">姓名</asp:TableCell>
  15. <asp:TableCell runat="server">成绩</asp:TableCell>
  16. </asp:TableRow>
  17. </asp:Table>
  18. </div>
  19. </form>
  20. </body>
  21. </html>
aspx.cs完整代码
  1. using System;
  2. using System.Web.UI.WebControls;
  3. public partial class Chap2_Table : System.Web.UI.Page
  4. {
  5. protected void Page_Load(object sender, EventArgs e)
  6. {
  7. string[] name = {"妹妹","哥哥"};
  8. string[] number = { "201924111", "201924112" };
  9. for (int i= 1; i<=2; i++)
  10. {
  11. TableRow row = new TableRow();//建立一个行对象
  12. TableCell cellNumber = new TableCell(); //建立第一个单元格对象
  13. TableCell cellName = new TableCell();
  14. TableCell cellInput = new TableCell();
  15. cellNumber.Text = number[i - 1];
  16. cellName.Text = name[i - 1];
  17. TextBox txtInput = new TextBox();//建立一个文本框对象
  18. cellInput.Controls.Add(txtInput);//添加文本框对象到第三个单元格中
  19. row.Cells.Add(cellNumber);//添加第一个单元格到行对象
  20. row.Cells.Add(cellName);
  21. row.Cells.Add(cellInput);
  22. tblScore.Rows.Add(row);//添加行对象到表格对象
  23. }
  24. }
  25. }