Js动态生成多层表头的表格

Js动态生成「纵向」多层表头的表格

前言

菜鸟来记录下自己工作中或者学习中遇到的问题和一些想法,各位看官也可以来指点一下,分享观点。
这是第一次写个人博客,之前也知道写技术博客对个人技术的提升很有效,但是一直没啥动力开动第一篇,昨天单位新开工个项目,技术架构不算前沿,Js里有一些是预封装的方法,不过很多地方会涉及到业务需求不一致,所以要自己手写Js。今天有一个纵向多层表头的表格,自己在写的时候发现一个很巧妙的写法,省去很多原本需要判断的地方。最初是在浏览器element中试着改colspan时发现的,后来发现可以和表格的数据循环很好的结合到一起,简化了原来的代码,原来的代码需要在ForEach循环中加判断,(不知为啥,这个项目里ForEach中写"=="会报错,这个问题之后再研究- -)。

需求

项目是军工项目,由于涉密,办公电脑不能访问公网,也禁用物理介质,具体页面效果等我之后想招上图。

代码

现在已经下班了,代码还在内网里,我就凭记忆把主要部分写出来吧。
由于表格的样式是根据后台返的数据来进行变化,所以要依靠Js来动态生成表格,所以html部分极简。

html

//抛掉所有外层代码 
<div id = myTable>
<thead><tr></tr></thead>
<tbody><tr></tr></tbody>
</div>

Js

//表头部分
$.demo.ajax('/my/url','post','{tpye:head}').done((data)=>{ //首先ajax从后台获取表头内容
$('#myTable thead tr').empty();//每次都要先清空表头
let htmlHead = '';//收集html表达式
let res = data.data;//ajax返回对象
htmlHead += `<tr class = myTable>`;
//循环拼接表头
res.forEach((d,i) => {
htmlHead += `<th>${d.name}</th>`;
});
htmlHead += `</tr>`;
//把拼好的表头渲染到页面
$('#myTable thead tr').html(htmlHead);
});
)

//表格数据部分
$demo.ajax('/my/bodyUrl','post','{tpye:head}').done((data) => {
$('#myTable tbody tr').empty();
let htmlBody = '';
let res = data.data;
//返回数据的格式 这里先写个demo 
//object(3){name:装甲装备,children:object:(4){name:自行火炮,contentlist:(object(5){name:装备数,content:15})}} ()里表示包含的对象数量

//第一层循环:大类名称
res.forEach((d,i) =>{
	htmlBody += `<tr>`;
	//这里的 +1 是重点,把纵向的第一列的表头单独看作一行,这一行只有一个td,根据子元素的数量,决定占多少行,+1是其本身占的行。这样二级表头在循环的时候就不用考虑加判断是否需要拼接一级表头,代码简化,而且性能提升。
	htmlBody += `<td rowspan = ${d.children.length + 1 }>${d.name}</td>`;
		//第二层循环:小类名称
		let res = d.children;//
		res.forEach((e,j) =>{
		htmlBody += `<tr>`;
		htmlBody += `<td>${e.name}</td>`;
			//第三层循环:小类数值
			let res = e.contentList;
			res.forEach((f,k) => {
			htmlBody += `<td>${f.content}</td>`
			})
		htmlBody += `</tr>`
		});

	htmlBody += `</tr>`
});
$('#myTable tbody tr').html(htmlBody);

});
)


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 了。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值