WebUI中DataGrid多层表头的终极解决办法

  因为DataGrid控件的简单易懂,大多数做.NET程序员都喜欢用,有需要把数据显示成表格样式的地方DataGrid会是首选,但是所有的东西都会有好和不好的一面,DataGrid在给我们带来了数据显示方便的同时,也给我们带来了不灵活的问题,多层表头就是例子。
      相信大家都遇到过这样的需求:

Head1
Head2
Head3
Head4
SubTitle1
SubTitle2

      我在网上Google和Baidu了一下,发现大家都是在DataGrid的ItemCreated和ItemDataBind事件中来实现的(实现的方法太多,这里就不用列举了),我觉得这样做效率不高而且麻烦,因为需要在系统中每个用到DataGrid的地方都需要添加那样的实现代码。所以我想可以通过重写DataGrid的Render方法来实现多层表头的显示,代码如下:
using  System;
using  System.Web.UI;
using  System.Web.UI.WebControls;
using  System.ComponentModel;

namespace  CustomDBGrid
{
    
/**//// <summary>
    
/// Custom DataGrid 的摘要说明。
    
/// </summary>

    [ToolboxData("<{0}:CustomDataGrid runat=server></{0}:CustomDataGrid>")]
    
public class CustomDataGrid : System.Web.UI.WebControls.DataGrid
    
{
        
public string HeadHTML
        
{
            
get{
                
if(ViewState["HeadHTML"!= null)
                    
return ViewState["HeadHTML"].ToString();
                
else
                    
return null;
            }

            
set{
                ViewState[
"HeadHTML"= value;
            }

        }

        
protected override void Render(HtmlTextWriter writer)
        
{
            System.IO.StringWriter stringWriter 
= new System.IO.StringWriter();
            System.Web.UI.HtmlTextWriter Tem_Writer 
= new HtmlTextWriter(stringWriter);
            
//获得原始输出结果
            base.Render(Tem_Writer);

            
string Tem_Str = stringWriter.ToString();
            
string StrToRender = Tem_Str;

            
if(this.HeadHTML != null)
            
{
                
//得到默认的表格第一行的HTML,这一行就是表格头了
                int Index_Head = Tem_Str.IndexOf("<tr>");
                
int Index_Last = Tem_Str.IndexOf("</tr>");
                
string OldHeadHTML = Tem_Str.Substring(Index_Head,Index_Last+5-Index_Head);
                
                
//将默认的表格头替换成我们想要的表格头HTML
                StrToRender = Tem_Str.Replace(OldHeadHTML,this.HeadHTML);
            }


            
//将新的结果输出到writer
            writer.Write(StrToRender);
        }


    }

}

     在有需要使用多层表头的地方使用这个自定义的DataGrid,只需要在DreamWeaver里面设计好一个表头,然后把CustomDatagrid的HeadHTML属性设置为在DreamWeaver中生成的HTML即可。

      比如你在DreamWeaver中得到的表头HTML是:
< TABLE >
    
< TR >
      
< TD  rowspan ="2" >< div  align ="center" ></ div >         
        
< div  align ="center" > Head1 </ div ></ TD >
      
< TD  rowspan ="2" >< div  align ="center" ></ div >         
        
< div  align ="center" > Head2 </ div ></ TD >
      
< TD  colspan ="2" >< div  align ="center" > Head3 </ div ></ TD >
      
< TD  rowspan ="2" >< div  align ="center" ></ div >         
        
< div  align ="center" > Head4 </ div ></ TD >
    
</ TR >
    
< TR >
      
< TD >< div  align ="center" > SubTitle1 </ div ></ TD >
      
< TD >< div  align ="center" > SubTitle2 </ div ></ TD >
    
</ TR >
</ TABLE >
     那么你只需把下面这段字符串赋值给CustomDataGrid的HeadHTML:
     < TR >
      
< TD  rowspan ="2" >< div  align ="center" ></ div >         
        
< div  align ="center" > Head1 </ div ></ TD >
      
< TD  rowspan ="2" >< div  align ="center" ></ div >         
        
< div  align ="center" > Head2 </ div ></ TD >
      
< TD  colspan ="2" >< div  align ="center" > Head3 </ div ></ TD >
      
< TD  rowspan ="2" >< div  align ="center" ></ div >         
        
< div  align ="center" > Head4 </ div ></ TD >
    
</ TR >
    
< TR >
      
< TD >< div  align ="center" > SubTitle1 </ div ></ TD >
      
< TD >< div  align ="center" > SubTitle2 </ div ></ TD >
    
</ TR >
      值得注意的是这里没有包括表格开始标签<Table>和表格结束标签</Table>,这取决于重写DataGrid的Render方法的方式,这里的重写方式不需要这两个标签。

       好了,现在不管在设计试图和还是在运行页面都可以看到多层表头的样子了。  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WPF DataGrid 支持多层表头,可以使用 DataGrid 的 ColumnHeaderStyle 属性来自定义表头样式。 首先,你需要定义表头的层次结构。可以使用 DataGrid 的 ColumnGroups 属性来定义多层表头。例如,下面的代码定义了两个层次的表头: ``` <DataGrid.ColumnHeaderStyle> <Style TargetType="{x:Type DataGridColumnHeader}"> <Setter Property="ContentTemplate"> <Setter.Value> <DataTemplate> <TextBlock Text="{Binding}"/> </DataTemplate> </Setter.Value> </Setter> </Style> </DataGrid.ColumnHeaderStyle> <DataGrid.ColumnGroups> <DataGridGroupHeader x:Name="GroupHeader1" Header="Group 1" FontWeight="Bold"/> <DataGridGroupHeader x:Name="GroupHeader2" Header="Group 2" FontWeight="Bold" ParentGroupHeader="{Binding ElementName=GroupHeader1}"/> </DataGrid.ColumnGroups> ``` 在这个例子,第一列的表头为 "Group 1",第二列的表头为 "Group 2",它们都是加粗的。第二列的表头是第一列的子表头,所以它们之间有一个缩进。 然后,你需要为每个表头单元格定义样式。可以使用 DataGrid 的 ColumnHeaderStyle 属性来定义默认样式,也可以为每个表头单元格定义不同的样式。例如,下面的代码定义了一个简单的表头样式: ``` <Style x:Key="HeaderCellStyle" TargetType="{x:Type DataGridColumnHeader}"> <Setter Property="Background" Value="#CCCCCC"/> <Setter Property="Foreground" Value="Black"/> <Setter Property="HorizontalContentAlignment" Value="Center"/> <Setter Property="VerticalContentAlignment" Value="Center"/> <Setter Property="BorderBrush" Value="#888888"/> <Setter Property="BorderThickness" Value="1"/> <Setter Property="Padding" Value="4"/> </Style> ``` 最后,将表头样式应用到 DataGrid 的每个列上。例如,下面的代码定义了两个列,并将表头样式应用到它们的表头单元格: ``` <DataGrid.Columns> <DataGridTextColumn Header="Column 1" Binding="{Binding Property1}" HeaderStyle="{StaticResource HeaderCellStyle}"/> <DataGridTextColumn Header="Column 2" Binding="{Binding Property2}" HeaderStyle="{StaticResource HeaderCellStyle}"/> </DataGrid.Columns> ``` 这样,你就可以创建一个具有多层表头的 WPF DataGrid 了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值