用Table或DataGrid实现表头锁定多层表头已经搞定,单行表头锁定也已经搞定。但是就是多层的没法实现。请各位大侠帮忙。小弟感激不尽。多层表头样式请浏览http://www.eq-qd.gov.cn/vip/upload/upfile/200510121602450.jpg现在就是怎么把绿色的表头锁定(两层)。分不够可以再开帖再加。谢了(搞定马上结帖)
解决方案 »
- Linq to sql 怎么绑定属性的属性?Eval("User.Username")报错
- mvc3 razor版本的MVCPaging.dll网上找不到,谁有给个
- 动态生成控件问题
- ExecuteReader 需要打开的并且可用的连接。该连接的当前状态是 Closed
- asp.net SqlCommand 调用Sql Server存储过程返回值正确,但数据未修改....
- 请问怎样实现复制功能啊
- 大家看我这个在web.config中配置数据库连接字符串中,哪里有错,为什么老是报错????????????
- 与ODBC数据源连接的问题!!急!
- 如何在DataGrid中获得记录总数??急!急!
- 我想不到还有什么其他好东西,用datagrid做数据统计如何???好控制吗?请大家给我个好例子!!
- 关于.NET里面用户状态的解决方案
- 求一完整DATAGRID添加CHECKBOX并实现全选及删除功能的代码C#的
前台:
<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));
}
}
不太明白你的意思呀,怎运行的呀。能否再指点一下呀。谢了
哦,我明白了。你这个只是实现了两层表头,这我已经实现了呀。现在我要做的是把这两层表头锁定。一层的我已经实现了。但是多层的就不行了。但是还是谢谢你呀。
这方法实现你要的效果,根据你提供的图第一列是选择列,跨两层所以你就可以采用方法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");
拷贝到处理列代码之后、填充代码之前即可,明白吗?
你的代码我能看明白。我的多层表头已经实现了呀。我所说的锁定就是让他固定不动,也就是DataGrid会出现一个滚动条。之滚动数据。表头不动呀!
<tr><td>表头,任意行</td></tr>
<tr><td>
<div style="自动显示滚动条等设置..." width=100% height=100%>
内嵌没有标题的table显示表内容
</div>
</td><tr>
</table>
http://www.eq-qd.gov.cn/vip/upload/upfile/200510121602450.jpg
怎么把绿色的锁定(固定)注意是两层不是单层的。谢了(分不够在加)
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;
}
}