学习Dot NET

导航

实现简单多层表头的办法

看到CSDN上有人问,如何实现多层表头的问题,将自己的办法拿出来,和大家讨论。要实现多层表头,人人都能想到的办法是:顶上放一个html的table,下面放一个DataGrid,但关键是table元素的单元格与DataGrid列的对齐问题,因为对于table元素即使为每一个单元格定制了宽度,单元格也会随其内容变宽,可以看下面的例子:
<table  border=1>
<tr>
<td width=100>1111</td>
<td>22222</td>
<tr>
<td  width=50>3333</td>
<td>4444</td>
<tr>
<td  width=50>55555</td>
<td>77777777777</td>
</tr>
</table>
如果将上面的<td width=100>1111111</td>改为<td width=100>1111111111111111111111</td>,单元格会跟着变宽,因此给顶上的table元素指定列宽行不通。
当然,也可以采用这种方式指定列宽<td><div class=css1>22222222222222222222222<div></td>
.css1
{}{
    white-space:nowrap;
    overflow:hidden;
    text-overflow:ellipsis;
    width:100px;
}
但缺点是DataGrid Render时也要加此样式。

我的办法很简单,具体是:
1、自己设计表头,就是设计table元素,有插入行、插入列、删除行列、合并行列等。表头存成xml或html的table格式。我是用服务器端代码写的,好像有js的,如swap或FreeTextBox,不知有没有合并、拆分单元格功能。
2、在表头下面放一个DataGrid,不过要重写这个DataGrid的render方法,去除其<table ......>部分,同时表头去除</table>。这样使表头table和DataGrid render后构成一个table元素。我写了一个自定义报表的工具就用了这种方法。

重写这个DataGrid的render方法:

protected override void Render(HtmlTextWriter output)
{
      StringWriter writer1 
= new StringWriter();
      HtmlTextWriter writer2 
= new HtmlTextWriter(writer1);
      
base.Render(writer2);
      
string text1 = writer1.ToString().Trim();
      text1 
= text1.Remove(0, text1.IndexOf(">"+ 1);
      output.Write(text1);
}
//可能变量名没有具体意义,我的源码找不到了,只好反编译了一下。

最后发发牢骚,不要打压能力比自己强的人,不要因为自己能力不如别人就别人的坏话,也不要看不起能力不如自己的人。如果你是项目组的头,一定要将这样的人剔除出去,这样的人太浮躁,一般不能踏踏实实干活,老让别人帮助解决问题,最后却说是自己解决的。一个老鼠屎坏了一锅汤呀,如果项目组的头是这样的人,组员就倒霉了,所有功劳肯定都是这头的,这是需要更上层领导的处理,不过一般这样的人都和领导关系很好,因为这样的人很会......领导,特别是国有企业里。个人建议这样的人到政府去做官。

posted on 2004-10-21 12:40  学习.NET  阅读(2155)  评论(0编辑  收藏  举报