效果图(网上copy的图片,使用方法请关注下方):
使用方法:
html页面除了基本的css和js外,创建分组子网格还需引入下方js,请自行下载。
<script type="text/javascript" src="../../easyui/datagrid-detailview.js"></script>
首先,在html页面创建table,table的class为 class=“easyui-datagrid”,此处略。
其次,使用js创建子网格数据(detailview)
$(function(){
$('#broTable').datagrid({
view: detailview,
detailFormatter:function(index,row){
return '<div style="padding:1px"><table id="ddv" class="ddv"></table></div>';
},
onExpandRow: function(index,row){
var ddv = $(this).datagrid('getRowDetail',index).find('table.ddv');
var tempindexc = -1;
var editIndex; //上一个index
var ddvProgram; //单击选中单条数据
var bro = $("#broDate").datebox("getValue");
id = row.id;
var sysDate = new Date();
var date = sysDate.getDate();
if (date >= 0 && date <= 9) {
date = "0" + date;
}
var b = sysDate.getFullYear()+"-"+(sysDate.getMonth()+1)+"-"+date;
if(bro == null || bro == "选择日期或查询"){
bro = sysDate.getFullYear()+"-"+(sysDate.getMonth()+1)+"-"+date;
}
var rows = $('#broTable').datagrid('getRows');
$.each(rows,function(i,k){
//获取当前所有展开的子网格
var expander = $('#broTable').datagrid('getExpander',i);
if(expander.length && expander.hasClass('datagrid-row-collapse')){
if(k.id != row.id){
//折叠上一次展开的子网格
$('#broTable').datagrid('collapseRow',i);
}
}
});
ddv.datagrid({
url:'anchProgramAction!selectAll.action?broDate='+bro.toString()+'&channelId='+row.id,
fitColumns:true,
singleSelect:true,
rownumbers:true,
loadMsg:'正在加载...',
height:'auto',
columns:[[
{field:'srName',title:'素材名称',width:230,align:'center'},
{field:'srTimes',title:'视频时长',width:100,align:'center'},
{field:'srSize',title:'视频大小',width:100,align:'center'},
{field:'srWidth',title:'视频尺寸',width:100,align:'center'},
{field:'broDate',title:'播出时间',width:180,align:'center'},
{field:'beginDate',title:'视频起始时间',width:180,align:'center',
editor:{type:'timespinner',options:{required : true, editable:false, showSeconds:true}},
formatter:function formatDateStr(value,rowData,index){
if(value.split("T").length>1){
value = value.split("T")[1];
}
return value;
}
},
{field:'endDate',title:'视频结束时间',width:180,align:'center',
editor:{type:'timespinner',options:{required :true , editable:false,showSeconds:true}},
formatter:function formatDateStr(value,rowData,index){
if(value.split("T").length>1){
value = value.split("T")[1];
}
return value;
}
},
{field:'broTimes',title:'编辑后时长',width:130,align:'center'},
]],
onResize:function(){
$('#broTable').datagrid('fixDetailRowHeight',index);//在加载成功时,获取父列表的明细高度,使其适应明显点开后的高度
},
onLoadSuccess:function(data){
setTimeout(function(){
$('#broTable').datagrid('fixDetailRowHeight',index);//在加载父列表明细成功时,获取此时整个列表的高度,使其适应变化后的高度,此时的索引
});
},
onCheck:function(rowIndex,rowData){
tData = ddv.datagrid('getData');
tempindexc = rowIndex;
ddvProgram = rowData;
},
toolbar:[
{
id:'saveId',
text:'保存',
iconCls:'icon-save',
handler:function(){
if(b > bro){
$.messager.alert("提示","小于今天日期禁止保存!","info");
}else{
$.messager.confirm("提示", "确定保存数据?", function(r){
if(r){
if (ddv.datagrid('validateRow', tempindexc)){
ddv.datagrid('endEdit', editIndex);
if(ddvCheckDateTime()){
var json = JSON.stringify(ddv.datagrid("getData").rows);
saveEditBroplan(json, row.id);
editIndex = undefined;
}else{
ddv.datagrid('selectRow', editIndex).datagrid('beginEdit', editIndex);
return false;
}
}
}
});
}
function ddvCheckDateTime(){
var r = ddv.datagrid("getRows")[editIndex];
oldChannelData = r;
if(r == undefined){
var json = JSON.stringify(ddv.datagrid("getData").rows);
saveEditBroplan(json, row.id);
editIndex = undefined;
// $('#saveId').linkbutton("disable"); //禁止button
}else{
var beginTime = ddvFormatTime(r.beginDate);
var endTime = ddvFormatTime(r.endDate);
var time = ddvFormatTime(r.srTimes);
if(endTime>time){
$.messager.alert("提示","结束播放时间超出素材总时长!","info");
return false;
}
if((endTime-beginTime)==0){
$.messager.alert("提示","素材播放时长必须大于0秒!","info");
return false;
}
if(beginTime>time){
$.messager.alert("提示","开始播放时间超出素材总时长!","info");
return false;
}
r.broTimes = ddvFormatSeconds(endTime-beginTime);
var broRows = ddv.datagrid("getRows");
var all = {'total':0,'rows':[]};
all.rows = ddvFormatRows(broRows);
ddv.datagrid("loadData",all);
changedDate = all.rows;
return true;
}
}
}
},
{
id:'addId',
text:'添加',
iconCls:'icon-add',
handler:function(){
if(b > bro){
$.messager.alert("提示","小于今天日期禁止添加!","info");
}else{
$('#add_tbb').dialog({
width:1000,
height:500,
title:"添加",
iconCls:"icon-add",
href:"safetyCkList.html",
});
selectChannel(row);
}
}
},
{
id:'deleteId',
text:'删除',
iconCls:'icon-remove',
handler:function(){
if(b > bro){
$.messager.alert("提示","小于今天日期禁止删除!","info");
}else{
if(ddvProgram != null){
$.messager.confirm("提示", "确定删除吗?", function(r){
if(r){
var rows = ddv.datagrid("getRows");
if(tempindexc == 0){
// if(rows.length == 1){
// rows.splice(tempindexc,1);
// }else{
rows.splice(tempindexc,1);
// rows[0].broDate = ddvProgram.broDate;
oldChannelData = ddvProgram;
// }
var ddvData = JSON.stringify(ddv.datagrid("getData").rows);
deleteRow(ddvProgram,ddvData,row.id);
}else{
rows.splice(tempindexc,1);
oldChannelData = ddvProgram;
var ddvData = JSON.stringify(ddv.datagrid("getData").rows);
deleteRow(ddvProgram,ddvData,row.id);
}
var all = {'total':0,'rows':[]};
all.rows = ddvFormatRows(rows);
ddv.datagrid("loadData",all);
changedDate = all.rows;
ddvProgram = null;
}
});
}else{
$.messager.alert("提示", "请选择数据!", "info");
}
}
}
},
{
text:'预览',
iconCls:'icon-reload',
handler:function(){
if(ddvProgram == null){
$.messager.alert("提示", "请选择数据!", "info");
}else{
showVideo(ddvProgram);
}
}
},
{
text:'上移',
iconCls: 'icon-undo',
handler:function(){
if(b > bro){
$.messager.alert("提示","小于今天日期禁止移动!","info");
}else{
if (isEdite == false) {
var data = tData;
if (tempindexc < 0) {
$.messager.alert("错误", "请先选择一条数据!", "error");
} else if (tempindexc == 0) {
$.messager.alert("提示", "已经是第一行了!", "info");
} else {
var temprow = data.rows[tempindexc];
data.rows[tempindexc] = data.rows[parseInt(tempindexc) - 1];
data.rows[parseInt(tempindexc) - 1] = temprow;
var temprowval = data.rows[tempindexc].OrderList;
data.rows[parseInt(tempindexc)].OrderList = data.rows[parseInt(tempindexc) - 1].OrderList;
data.rows[parseInt(tempindexc) - 1].OrderList = temprowval;
ddv.datagrid("selectRow", parseInt(tempindexc) - 1);
//得到移动数据的上一条编辑后时长
oldChannelData = temprow;
var all = {'total':0,'rows':[]};
var state = "undo";
all.rows = ddvFormat(data.rows,state);
ddv.datagrid("loadData",all);
changedDate = all.rows;
}
}
else {
$.messager.alert("错误", "请先保存数据!", "error");
}
}
}
},
{
text:'下移',
iconCls: 'icon-redo',
handler:function(){
if(b > bro){
$.messager.alert("提示","小于今天日期禁止移动!","info");
}else{
if (isEdite == false) {
var data = tData;
if (tempindexc < 0) {
$.messager.alert("错误", "请先选择一条数据!", "error");
} else if (tempindexc == data.rows.length - 1) {
$.messager.alert("提示", "已经是最后一行了!", "info");
} else {
var temprow = data.rows[tempindexc];
// 移动行的索引 加1
data.rows[tempindexc] = data.rows[parseInt(tempindexc) + 1];
data.rows[parseInt(tempindexc) + 1] = temprow;
var temprowval = data.rows[tempindexc].OrderList;
data.rows[parseInt(tempindexc)].OrderList = data.rows[parseInt(tempindexc) + 1].OrderList;
data.rows[parseInt(tempindexc) + 1].OrderList = temprowval;
ddv.datagrid("selectRow", parseInt(tempindexc) + 1);
oldChannelData = temprow;
var all = {'total':0,'rows':[]};
var state = "redo";
all.rows = ddvFormatUp(data.rows,state);
ddv.datagrid("loadData",all);
changedDate = all.rows;
}
}
else {
$.messager.alert("错误", "请先保存数据!", "error");
}
}
}
},
{
id:'edit',
text:'编辑',
iconCls:'icon-edit',
handler:function(){
if(b > bro){
$.messager.alert("提示","小于今天日期禁止编辑!","info");
}else{
if (editIndex != tempindexc){
if (ddvEndEditing()){
ddv.datagrid('beginEdit', tempindexc);
var v = ddv.datagrid('selectRow', tempindexc).datagrid('beginEdit', tempindexc);
editIndex = tempindexc;
} else {
// ddv.datagrid('beginEdit', rowIndex);
ddv.datagrid('selectRow', editIndex);
}
}
}
function ddvEndEditing(){
if (editIndex == undefined){return true}
if (ddv.datagrid('validateRow', editIndex)){
ddv.datagrid('endEdit', editIndex);
if(ddvCheckDateTime()){
editIndex = undefined;
return true;
}else{
ddv.datagrid('selectRow', editIndex).datagrid('beginEdit', editIndex);
return false;
}
} else {
return false;
}
}
function ddvCheckDateTime(){
var row = ddv.datagrid("getRows")[editIndex];
oldChannelData = row;
var beginTime = ddvFormatTime(row.beginDate);
var endTime = ddvFormatTime(row.endDate);
var time = ddvFormatTime(row.srTimes);
if(endTime>time){
$.messager.alert("提示","结束播放时间超出素材总时长!","info");
return false;
}
if((endTime-beginTime)==0){
$.messager.alert("提示","素材播放时长必须大于0秒!","info");
return false;
}
if(beginTime>time){
$.messager.alert("提示","开始播放时间超出素材总时长!","info");
return false;
}
row.broTimes = ddvFormatSeconds(endTime-beginTime);
var broRows = ddv.datagrid("getRows");
var all = {'total':0,'rows':[]};
all.rows = ddvFormatRows(broRows);
ddv.datagrid("loadData",all);
changedDate = all.rows;
return true;
}
}
}]
});
$('#broTable').datagrid('fixDetailRowHeight',index);
}
});
});
function ddvFormatRows(rows){
var beginTime = oldChannelData.beginDate;//获取修改的播放时间
for ( var i = 0; i < rows.length; i++) {//循环数据,根据天分割来修改时间
var date;
if(i == 0){
date = rows[i].broDate.substring(11);
rows[i].broDate = rows[i].broDate;
}else{
if(rows[i].broDate.substring(0,11) == rows[i-1].broDate.substring(0,11)){
date = rows[i-1].broDate.substring(11);
rows[i].broDate = rows[i-1].broDate.substring(0,11) +" "+ddvCountBeginTime(date,rows[i-1].broTimes);//将时间(时分秒)传入并修改,方法如下
}else{
break;
}
}
}
return rows;
}
function ddvFormat(rows,state){
var beginTime = oldChannelData.beginDate;//获取修改的播放时间
if(beginTime.indexOf("T") != -1){
beginTime = beginTime.substring(11);
}
for ( var i = 0; i < rows.length; i++) {//循环数据,根据天分割来修改时间
var date;
if(i == 0){
if(rows[i].id == oldChannelData.id){
if(state == "redo"){
rows[i].broDate = rows[i].broDate;
}else{
date = rows[i].broDate.substring(11);
rows[i].broDate = rows[i + 1].broDate;
}
}else{
if(state == "redo"){
rows[i].broDate = rows[i].broDate;
}else{
rows[i].broDate = rows[i].broDate;
}
}
}else{
if(rows[i].broDate.substring(0,11) == rows[i-1].broDate.substring(0,11)){
date = rows[i-1].broDate.substring(11);
rows[i].broDate = rows[i-1].broDate.substring(0,11) +" "+ddvCountBeginTime(date,rows[i-1].broTimes);//将时间(时分秒)传入并修改,方法如下
}else{
continue;
}
}
}
return rows;
}
function ddvFormatUp(rows,state){
var beginTime = oldChannelData.beginDate;//获取修改的播放时间
if(beginTime.indexOf("T") != -1){
beginTime = beginTime.substring(11);
}
for ( var i = 0; i < rows.length; i++) {//循环数据,根据天分割来修改时间
var date;
if(i == 0){
if(rows[i+1].id == oldChannelData.id){
if(state == "redo"){
rows[i].broDate = rows[i + 1].broDate;
}else{
date = rows[i].broDate.substring(11);
rows[i].broDate = rows[i + 1].broDate;
}
}else{
if(state == "redo"){
rows[i].broDate = rows[i].broDate;
}else{
rows[i].broDate = rows[i].broDate;
}
}
}else{
if(rows[i].broDate.substring(0,11) == rows[i-1].broDate.substring(0,11)){
date = rows[i-1].broDate.substring(11);
rows[i].broDate = rows[i-1].broDate.substring(0,11) +" "+ddvCountBeginTime(date,rows[i-1].broTimes);//将时间(时分秒)传入并修改,方法如下
}else{
continue;
}
}
}
return rows;
}
function ddvCountBeginTime(beginTime,length){
var broDate = parseInt(ddvFormatTime(beginTime) + ddvFormatTime(length));
return ddvFormatSeconds(broDate);//时间转换
}
function ddvFormatTime(time){
var timeArr = time.split(":");
var hh = 0;
var mi = 0;
var ss = parseInt(timeArr[eval(timeArr.length-1)]);
var seconds = 0;
if(timeArr.length==3){
hh = parseInt(timeArr[0]*60*60);
mi = parseInt(timeArr[1]*60);
}
if(timeArr.length==2){
mi = parseInt(timeArr[0]*60);
}
seconds = parseInt(hh + mi + ss);
return seconds;
}
function ddvFormatSeconds(seconds){
var theTime = 0;
theTime = parseInt(seconds);// 秒
var theTime1 = 0;// 分
var theTime2 = 0;// 小时
if(theTime > 60) {
theTime1 = parseInt(theTime/60);
theTime = parseInt(theTime%60);
if(theTime1 > 60) {
theTime2 = parseInt(theTime1/60);
theTime1 = parseInt(theTime1%60);
}
}
var result;
result = (parseInt(theTime2)<10?"0"+theTime2:theTime2)+":"+(parseInt(theTime1)<10?"0"+theTime1:theTime1)+":"+(parseInt(theTime)<10?"0"+theTime:theTime);
return result;
}
function selects(b){
$.post('anchChannelAction!selectAsList.action?t='+new Date(),{broDate:b},function(data){
eval("data="+data);
$("#broTable").datagrid("loadData",data["rows"]);
});
}