天天看点

ASP.NET 2.0中GridView无限层复杂表头的实现

实现方法就是给单元格填充我们想要的格式代码。

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 >