天天看點

[轉]ASP.NET 2.0中GridView無限層複雜表頭的實作

本文轉自:http://blog.csdn.net/net_lover/article/details/1306211

實作方法就是給單元格填充我們想要的格式代碼。

[轉]ASP.NET 2.0中GridView無限層複雜表頭的實作

C#

<%@ Page Language="C#" AutoEventWireup="true" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

  // 計算資料,完全可以從資料看取得

  ICollection CreateDataSource( )

  {

    System.Data.DataTable dt = new System.Data.DataTable();

    System.Data.DataRow dr;

    dt.Columns.Add(new System.Data.DataColumn("學生班級", typeof(System.String)));

    dt.Columns.Add(new System.Data.DataColumn("學生姓名", typeof(System.String)));

    dt.Columns.Add(new System.Data.DataColumn("國文", typeof(System.Decimal)));

    dt.Columns.Add(new System.Data.DataColumn("數學", typeof(System.Decimal)));

    dt.Columns.Add(new System.Data.DataColumn("英語", typeof(System.Decimal)));

    dt.Columns.Add(new System.Data.DataColumn("計算機", typeof(System.Decimal)));

    for (int i = 0; i < 8; i++)

    {

      System.Random rd = new System.Random(Environment.TickCount * i); ;

      dr = dt.NewRow();

      dr[0] = "班級" + i.ToString();

      dr[1] = "學生" + i.ToString();

      dr[2] = System.Math.Round(rd.NextDouble() * 100, 2);

      dr[3] = System.Math.Round(rd.NextDouble() * 100, 2);

      dr[4] = System.Math.Round(rd.NextDouble() * 100, 2);

      dr[5] = System.Math.Round(rd.NextDouble() * 100, 2);

      dt.Rows.Add(dr);

    }

    System.Data.DataView dv = new System.Data.DataView(dt);

    return dv;

  }

  protected void Page_Load( object sender, EventArgs e )

  {

    if (!IsPostBack)

    {

      GridView1.BorderColor = System.Drawing.Color.DarkOrange;

      GridView1.DataSource = CreateDataSource();

      GridView1.DataBind();

    }

  }

  protected void GridView1_RowCreated( object sender, GridViewRowEventArgs e )

  {

    if (e.Row.RowType == DataControlRowType.Header)

    {

      //建立一個GridViewRow,相當于表格的 TR 一行

      GridViewRow rowHeader = new GridViewRow(0, 0, DataControlRowType.Header, DataControlRowState.Normal);

      string HeaderBackColor = "#EDEDED";

      rowHeader.BackColor = System.Drawing.ColorTranslator.FromHtml(HeaderBackColor);

      //實作确定要顯示的表頭樣式,也可以通過計算生成

      //    <tr>

      //      <td rowspan='2'>關鍵單元格</td>

      //      <td colspan='2'>表頭文字</td>

      //      <td colspan='2'>表頭文字</td>

      //      <td>表頭文字</td>

      //      </tr>

      //      <tr bgcolor='#FFF'>

      //      <td colspan='2'>表頭文字</td>

      //      <td rowspan='2'>表頭文字</td>

      //      <td colspan='2'>表頭文字</td>

      //      </tr>

      //      <tr bgcolor='#FFF'>

      //      <td>表頭文字</td>

      //      <td>表頭文字</td>

      //      <td>表頭文字</td>

      //      <td>表頭文字</td>

      //      <td>表頭文字</td>";

      //   </tr>

      // 上面的樣式可以設定斜線

      Literal newCells = new Literal();

      newCells.Text = @"表頭文字1</th>

                  <th colspan='2'>表頭文字2</th>

                  <th colspan='2'>表頭文字3</th>

                  <th>表頭文字4</th>

                  </tr>

                  <tr bgcolor='" + HeaderBackColor + "'>";

      newCells.Text += @"                         

                  <th colspan='2'>表頭文字5</th>

                  <th rowspan='2'>表頭文字6</th>

                  <th colspan='2'>表頭文字7</th>

                  </tr>

                  <tr bgcolor='" + HeaderBackColor + "'>";

      newCells.Text += @"  

                  <th>表頭文字8</th>

                  <th>表頭文字9</th>

                  <th>表頭文字10</th>

                  <th>表頭文字11</th>

                  <th>表頭文字12";

      TableCellCollection cells = e.Row.Cells;

      TableHeaderCell headerCell = new TableHeaderCell();

      //下面的屬性設定與 <td rowspan='2'>關鍵單元格</td> 要一緻

      headerCell.RowSpan = 2;

      headerCell.Controls.Add(newCells);

      rowHeader.Cells.Add(headerCell);

      rowHeader.Cells.Add(headerCell);

      rowHeader.Visible = true;

      //添加到 GridView1

      GridView1.Controls[0].Controls.AddAt(0, rowHeader);

    }

  }

  protected void GridView1_RowDataBound( object sender, GridViewRowEventArgs e )

  {

    if (e.Row.RowType == DataControlRowType.Header)

    {

      e.Row.Attributes.Add("style", "background:#9999FF;color:#FFFFFF;font-size:14px");

    }

    else

    {

      e.Row.Attributes.Add("style", "background:#FFF");

    }

  }

</script>

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

  <title>為 GridView 添加多層表頭</title>

</head>

<body>

  <form id="Form1" runat="server">

    <asp:GridView ID="GridView1" runat="server" CellSpacing="1" CellPadding="3" Font-Size="12px"

      Width="600px" BackColor="#000000" BorderWidth="0" OnRowDataBound="GridView1_RowDataBound"

      OnRowCreated="GridView1_RowCreated">

    </asp:GridView>

  </form>

</body>

</html>

VB.NET

<%@ Page Language="VB" AutoEventWireup="true" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

  Function CreateDataSource() As ICollection

    Dim dt As System.Data.DataTable = New System.Data.DataTable

    Dim dr As System.Data.DataRow

    dt.Columns.Add(New System.Data.DataColumn("學生班級", GetType(System.String)))

    dt.Columns.Add(New System.Data.DataColumn("學生姓名", GetType(System.String)))

    dt.Columns.Add(New System.Data.DataColumn("國文", GetType(System.Decimal)))

    dt.Columns.Add(New System.Data.DataColumn("數學", GetType(System.Decimal)))

    dt.Columns.Add(New System.Data.DataColumn("英語", GetType(System.Decimal)))

    dt.Columns.Add(New System.Data.DataColumn("計算機", GetType(System.Decimal)))

    Dim i As Integer = 0

    While i < 8

      Dim rd As System.Random = New System.Random(Environment.TickCount * i)

      dr = dt.NewRow

      dr(0) = "班級" + i.ToString

      dr(1) = "學生" + i.ToString

      dr(2) = System.Math.Round(rd.NextDouble * 100, 2)

      dr(3) = System.Math.Round(rd.NextDouble * 100, 2)

      dr(4) = System.Math.Round(rd.NextDouble * 100, 2)

      dr(5) = System.Math.Round(rd.NextDouble * 100, 2)

      dt.Rows.Add(dr)

      System.Math.Min(System.Threading.Interlocked.Increment(i), i - 1)

    End While

    Dim dv As System.Data.DataView = New System.Data.DataView(dt)

    Return dv

  End Function

  Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)

    If Not IsPostBack Then

      GridView1.BorderColor = System.Drawing.Color.DarkOrange

      GridView1.DataSource = CreateDataSource()

      GridView1.DataBind()

    End If

  End Sub

  Protected Sub GridView1_RowCreated(ByVal sender As Object, ByVal e As GridViewRowEventArgs)

    If e.Row.RowType = DataControlRowType.Header Then

      Dim rowHeader As GridViewRow = New GridViewRow(0, 0, DataControlRowType.Header, DataControlRowState.Normal)

      Dim HeaderBackColor As String = "#EDEDED"

      rowHeader.BackColor = System.Drawing.ColorTranslator.FromHtml(HeaderBackColor)

      Dim newCells As Literal = New Literal

      newCells.Text = "表頭文字1</th>" + _

                      " <th colspan='2'>表頭文字2</th>" + _

                      " <th colspan='2'>表頭文字3</th>" + _

                      " <th>表頭文字4</th>" + _

                      " </tr>" + _

                      " <tr bgcolor='" + HeaderBackColor + "'>" + _

                      "  <th colspan='2'>表頭文字5</th>" + _

                      "  <th rowspan='2'>表頭文字6</th>" + _

                      " <th colspan='2'>表頭文字7</th>" + _

                      " </tr>" + _

                      " <tr bgcolor='" + HeaderBackColor + "'>" + _

                      "  <th>表頭文字8</th>" + _

                      "  <th>表頭文字9</th>" + _

                      "  <th>表頭文字10</th>" + _

                      "  <th>表頭文字11</th>" + _

                      "  <th>表頭文字12"

      Dim cells As TableCellCollection = e.Row.Cells

      Dim headerCell As TableHeaderCell = New TableHeaderCell

      headerCell.RowSpan = 2

      headerCell.Controls.Add(newCells)

      rowHeader.Cells.Add(headerCell)

      rowHeader.Cells.Add(headerCell)

      rowHeader.Visible = True

      GridView1.Controls(0).Controls.AddAt(0, rowHeader)

    End If

  End Sub

  Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs)

    If e.Row.RowType = DataControlRowType.Header Then

      e.Row.Attributes.Add("style", "background:#9999FF;color:#FFFFFF;font-size:14px")

    Else

      e.Row.Attributes.Add("style", "background:#FFF")

    End If

  End Sub

</script>

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

  <title>為 GridView 添加多層表頭</title>

</head>

<body>

  <form id="Form1" runat="server">

    <asp:GridView ID="GridView1" runat="server" CellSpacing="1" CellPadding="3" Font-Size="12px"

      Width="600px" BackColor="#000000" BorderWidth="0" OnRowDataBound="GridView1_RowDataBound"

      OnRowCreated="GridView1_RowCreated">

    </asp:GridView>

  </form>

</body>

</html>