用Table或DataGrid实现表头锁定多层表头已经搞定,单行表头锁定也已经搞定。但是就是多层的没法实现。请各位大侠帮忙。小弟感激不尽。多层表头样式请浏览http://www.eq-qd.gov.cn/vip/upload/upfile/200510121602450.jpg现在就是怎么把绿色的表头锁定(两层)。分不够可以再开帖再加。谢了(搞定马上结帖)

解决方案 »

  1.   

    参考一下:
    前台:
    <asp:DataGrid id="DataGrid1" runat="server" AllowPaging="True" CellPadding="4" BackColor="White"
    BorderWidth="1px" BorderColor="Black" Font-Size="9pt" AutoGenerateColumns="False" BorderStyle="None"
    Width="100%" PageSize="40">
    <ItemStyle HorizontalAlign="Center" VerticalAlign="Middle"></ItemStyle>
    <HeaderStyle Font-Size="9pt" HorizontalAlign="Center" ForeColor="Black" BackColor="White"></HeaderStyle>
    <Columns>
    <asp:BoundColumn HeaderText="电脑号" DataField="dnh"></asp:BoundColumn>
    <asp:BoundColumn DataField="xm" HeaderText="姓名"></asp:BoundColumn>
    <asp:BoundColumn DataField="xb" HeaderText="性别"></asp:BoundColumn>
    <asp:BoundColumn DataField="sfj" HeaderText="身份证号"></asp:BoundColumn>
    <asp:BoundColumn DataField="szgw" HeaderText="职工身份"></asp:BoundColumn>
    <asp:TemplateColumn HeaderText="户口性质">
    <ItemTemplate>
    <asp:Label id=l_hkxz runat="server" Text='<%# GetHkxz(DataBinder.Eval(Container, "DataItem.hkxz").ToString()) %>'>
    </asp:Label>
    </ItemTemplate>
    </asp:TemplateColumn>
    <asp:BoundColumn DataField="gz" HeaderText="缴费工资"></asp:BoundColumn>
    <asp:BoundColumn DataField="jfrq" HeaderText="本次缴费开始时间"></asp:BoundColumn>
    <asp:BoundColumn DataField="yl_dw" HeaderText="养老单位"></asp:BoundColumn>
    <asp:BoundColumn DataField="yl_gr" HeaderText="养老个人"></asp:BoundColumn>
    <asp:BoundColumn DataField="yldw" HeaderText="医疗单位"></asp:BoundColumn>
    <asp:BoundColumn DataField="ylgr" HeaderText="医疗个人"></asp:BoundColumn>
    <asp:BoundColumn DataField="zdjb" HeaderText="重大疾"></asp:BoundColumn>
    <asp:BoundColumn DataField="sy_dw" HeaderText="失业单位"></asp:BoundColumn>
    <asp:BoundColumn DataField="sy_gr" HeaderText="失业个人"></asp:BoundColumn>
    <asp:BoundColumn DataField="gs" HeaderText="工伤"></asp:BoundColumn>
    <asp:BoundColumn DataField="sy" HeaderText="生育"></asp:BoundColumn>
    <asp:BoundColumn DataField="czj" HeaderText="操作员"></asp:BoundColumn>
    <asp:TemplateColumn HeaderText="变动类型">
    <ItemTemplate>
    <asp:Label id="l_bdlx" runat="server" Text='<%# GetBdlx(DataBinder.Eval(Container, "DataItem.bdlx").ToString()) %>'>
    </asp:Label>
    </ItemTemplate>
    </asp:TemplateColumn>
    </Columns>
    <PagerStyle Visible="False" NextPageText="下一页" PrevPageText="上一页" HorizontalAlign="Left" ForeColor="#003399"
    Position="Top" BackColor="#99CCCC" Mode="NumericPages"></PagerStyle>
    </asp:DataGrid>
    后台:
    private void InitializeComponent()
    {    
    this.Load += new System.EventHandler(this.Page_Load);
              this.DataGrid1.ItemCreated += new DataGridItemEventHandler(this.Datagrid_ItemCreated);//加上这句
    }
    private void NewRenderMethod(HtmlTextWriter writer, Control ctl) 

    for(int i = 0; i < 8; i++)//前8列单行显示,跨两行
    {
    TableCell cell1 = (TableCell)ctl.Controls[i]; 
    cell1.Attributes.Add("rowspan", "2"); 
    cell1.RenderControl(writer);
    }
    writer.Write("<TD colspan=\"9\" align=\"center\">各险种明细</TD>\n"); //中间9列分两行,第一行跨9列,标题为各险种明细
    for(int i = 2; i > 0; i--)//最后两列单行显示,跨两行
    {
    TableCell cell = (TableCell)ctl.Controls[ctl.Controls.Count-i]; 
    cell.Attributes.Add("rowspan","2"); 
    cell.RenderControl(writer);
    }
    writer.Write("</TR>\n"); 
    this.DataGrid1.HeaderStyle.AddAttributesToRender(writer); 
    writer.RenderBeginTag("TR"); 
    for(int i = 8; i <= 16; i++)//把中间9列的绑定列补上去即可 

    ctl.Controls[i].RenderControl(writer); 

    } private void Datagrid_ItemCreated(object sender, 
    System.Web.UI.WebControls.DataGridItemEventArgs e) 
    {  
    if(e.Item.ItemType == ListItemType.Header) 

    e.Item.SetRenderMethodDelegate(new RenderMethod(NewRenderMethod)); 
    }
    }
      

  2.   

    TO:stoneallen(我不想说,我很亲切)
    不太明白你的意思呀,怎运行的呀。能否再指点一下呀。谢了
      

  3.   

    TO:stoneallen(我不想说,我很亲切)
    哦,我明白了。你这个只是实现了两层表头,这我已经实现了呀。现在我要做的是把这两层表头锁定。一层的我已经实现了。但是多层的就不行了。但是还是谢谢你呀。
      

  4.   

    主要是private void NewRenderMethod(HtmlTextWriter writer, Control ctl) 
    这方法实现你要的效果,根据你提供的图第一列是选择列,跨两层所以你就可以采用方法1
    for(int i = 0; i < 1; i++)//循环一次,index从0开始
    {
    TableCell cell1 = (TableCell)ctl.Controls[i]; //设置第一列,ctl.Controls[i]的i表示该列的index
    cell1.Attributes.Add("rowspan", "2"); //设置第一列跨两行
    cell1.RenderControl(writer);
    }
    然后下一步你就要处理帐号和电子邮件这两列了,因为是要分两层的,所以你就要先定义第一层标题“姓名”,所以你就可以采用方法2
    writer.Write("<TD colspan=\"2\" align=\"center\">姓名</TD>\n"); //这两列分两层,通过colspan="2"设置,因为双引号在字符串中要写成\"形式,所以代码中就成了colspan=\"2\",标题为姓名
    后面各列以此类推,遇到跨两行然后单行显示的就继续采用方法1
    for(int i = 0; i < 1; i++)//注意这里的i要从该列的index开始,循环的次数根据你的图决定,比如最后5列都是单行显示的,循环次数就应该为5
    {
    TableCell cell1 = (TableCell)ctl.Controls[i]; //设置第一列,ctl.Controls[i]的i表示该列的index
    cell1.Attributes.Add("rowspan", "2"); //设置第一列跨两行
    cell1.RenderControl(writer);
    }
    同理遇到分两层的列则继续采用方法2
    writer.Write("<TD colspan=\"2\" align=\"center\">姓名</TD>\n"); //这两列分两层,通过colspan="2"设置,因为双引号在字符串中要写成\"形式,所以代码中就成了colspan=\"2\",标题为姓名
    当所有的列都处理过了,就要把分两层的列补上去,比如第二列和第三列分两层就要采用方法三填充
    for(int i = 1; i <= 2; i++)//把第二列和第三列补上去,index从1开始

        ctl.Controls[i].RenderControl(writer); //填充目的列

    类似也一样处理,中间的代码
    writer.Write("</TR>\n"); 
    this.DataGrid1.HeaderStyle.AddAttributesToRender(writer); 
    writer.RenderBeginTag("TR"); 
    拷贝到处理列代码之后、填充代码之前即可,明白吗?
      

  5.   

    TO:stoneallen(我不想说,我很亲切)
    你的代码我能看明白。我的多层表头已经实现了呀。我所说的锁定就是让他固定不动,也就是DataGrid会出现一个滚动条。之滚动数据。表头不动呀!
      

  6.   

    http://community.csdn.net/Expert/topic/4150/4150195.xml?temp=.6106226
      

  7.   

    我不明白的是你为啥要用滚动条呢?一般用DataGrid显示数据如果遇到数据多的话加个分页和查询功能不是更好,这样的话也就不存在锁定不锁定的问题了.
      

  8.   

    <table border=....>
    <tr><td>表头,任意行</td></tr>
    <tr><td>
      <div style="自动显示滚动条等设置..." width=100% height=100%>
         内嵌没有标题的table显示表内容
      </div>
    </td><tr>
    </table>
      

  9.   

    http://www.pconline.com.cn/pcedu/empolder/net/0411/488314.html
      

  10.   

    你们都误解我的意思了,我要的是锁定(固定)多层表头,多层表头我已经实现了。锁定(固定)单层的表头我也已经实现了。现在的问题是怎么样锁定(固定)多层的表头。我做的多层表头请看
    http://www.eq-qd.gov.cn/vip/upload/upfile/200510121602450.jpg
    怎么把绿色的锁定(固定)注意是两层不是单层的。谢了(分不够在加)
      

  11.   

    参考
    http://singlepine.cnblogs.com/articles/266538.html
    http://community.csdn.net/Expert/topic/4150/4150195.xml?temp=.139477有方法
    private void DataGrid1_ItemDataBound(object sender, DataGridItemEventArgs e)
    {        
           if (e.Item.ItemType==ListItemType.Header)
          {                
                   e.Item.Cells[0].ColumnSpan=2;//合并单元格
                   e.Item.Cells[1].Visible=false;
           }
    }