3、easyUI-创建 CRUD可创建展开行明细编辑dataGrid(表格)
同样在上一节中讲到可以编辑的表格,现在讲一般用到的最后一个datagrid(表格)相关的展开明细可编辑的表格;
第三中表格主要应用场景在:列出表格信息,然后点击可以查看详细信息(此处是全部可以编辑,可以改写),举个例子,人员信息有很多字段,但是一般在列表信息只显示人员相关的主要字段,但是如果想看人员所有信息的话,就可通过这个方法来实现,声明一点,这里的是可以编辑的,你可以做成不可编辑;
再说两句,比如在第一节的时候,如果只提供一张表格表单,进行添加信息,然后在列表页中列出人员信息,列出的人员信息不允许编辑,只可以查看,就可以使用这节的表格;
开始任务:
首先在网上下载datagrid-detailview.js文件(稍后附出代码文件的js);
然后新建一个index.php,将js文件引入;
后台代码使用第二节的,无需更改,不做介绍;
第一步,先看效果图:
展开明细,可编辑(你可以改写成不可修改,只可以看)
添加明细视图:
第二步:编写index.php页面代码
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>创建展开行明细编辑表单</title> <link rel="stylesheet" type="text/css" href="../ui/jquery-easyui-1.4.5/themes/default/easyui.css"> <link rel="stylesheet" type="text/css" href="../ui/jquery-easyui-1.4.5/themes/icon.css"> <link rel="stylesheet" type="text/css" href="../ui/jquery-easyui-1.4.5/themes/color.css"> <script src="../ui/jquery-easyui-1.4.5/jquery.min.js"></script> <script src="../ui/jquery-easyui-1.4.5/jquery.easyui.min.js"></script> <script src="../js/crud/datagrid-detailview.js"></script> <script src="../ui/jquery-easyui-1.4.5/locale/easyui-lang-zh_CN.js"></script> <script src="../js/crud/bus_pubuser.js"></script> <script> $(function(){ $('#dg').datagrid({ view: detailview, detailFormatter:function(index,row){ return '<div class="ddv"></div>'; }, onExpandRow: function(index,row){ var ddv = $(this).datagrid('getRowDetail',index).find('div.ddv'); ddv.panel({ border:false, cache:true, href:'./page/show_form.php?index='+index, onLoad:function(){ $('#dg').datagrid('fixDetailRowHeight',index); $('#dg').datagrid('selectRow',index); $('#dg').datagrid('getRowDetail',index).find('form').form('load',row); } }); $('#dg').datagrid('fixDetailRowHeight',index); } }); }); </script> </head> <body> <!-- 作者:ethancoco 时间:2016-07-10 描述:list --> <table id="dg" title="用户列表" class="easyui-datagrid" url="./data/crud/userAction.php?flag=list" style="width:100%;height: 600px;" toolbar="#toolbar" rownumbers="true" pagination="true" fitColumns="true" singleSelect="true"> <thead> <tr> <th field="fname" width="50" >名</th> <th field="lname" width="50" >姓</th> <th field="sex" width="50" >性别</th> <th field="phone" width="50" >联系电话</th> <th field="email" width="50" >邮件</th> </tr> </thead> </table> <div id="toolbar"> <a href="#" class="easyui-linkbutton" iconCls="icon-add" plain="true" onclick="newItem()">添加</a> <a href="#" class="easyui-linkbutton" iconCls="icon-remove" plain="true" onclick="destroyItem()">删除</a> </div> </body> <html>
首先看table部分,url自动请求地址获取用户信息列表数据展示,pagination="true"表示带分页,然后就是toolbar下的两个方法newItem()和destroyItem(),其中destroyItem()方法和之前第一节的一样;
然后我们看javascript部分的一段代码:这种格式记住,理解,直接拿来用就可以,使用 'detailFormatter' 函数来生成行明细内容,当用户点击行展开按钮('+')时,'onExpandRow' 事件将被触发,我们将通过 ajax 加载编辑表单(form)。 调用 'getRowDetail' 方法来得到行明细容器,在行明细中创建面板(panel),加载从 'show_form.php' 返回的编辑表单;
第三步:编写show_form.php即明细行表单
<form method="post"> <table class="dv-table" style="width:100%;background:#fafafa;padding:5px;margin-top:5px;"> <tr> <td>名</td> <td><input name="fname" class="easyui-validatebox" required="true"></input></td> <td>姓</td> <td><input name="lname" class="easyui-validatebox" required="true"></input></td> </tr> <tr> <td>性别</td> <td colspan="3"><input name="sex" class="easyui-validatebox" required="true"></input></td> </tr> <tr> <td>电话</td> <td><input name="phone"></input></td> <td>邮件</td> <td><input name="email" class="easyui-validatebox" validType="email"></input></td> </tr> </table> <div style="padding:5px 0;text-align:right;padding-right:30px"> <a href="#" class="easyui-linkbutton" iconCls="icon-save" plain="true" onclick="saveItem(<?php echo $_REQUEST['index'];?>)">Save</a> <a href="#" class="easyui-linkbutton" iconCls="icon-cancel" plain="true" onclick="cancelItem(<?php echo $_REQUEST['index'];?>)">Cancel</a> </div> </form>
第四步:实现saveItem(),cancelItem(),newItem(),destroyItem()四个方法
实现newItem()方法:
function newItem(){
$('#dg').datagrid('appendRow',{isNewRecord:true});
var index = $('#dg').datagrid('getRows').length - 1;
$('#dg').datagrid('expandRow', index);
$('#dg').datagrid('selectRow', index);
}
appendRow追加一个新行。新行将被添加到最后的位置,给他一个{isNewRecord:true}属性,可以在saveItem方法中判断,
getRows返回当前所有行;
实现saveItem()方法:
function saveItem(index){
var row = $('#dg').datagrid('getRows')[index];
var urladd = './data/crud/userAction.php?flag=add';
var urlmodify = './data/crud/userAction.php?flag=modify&id='+row.id;
var url = row.isNewRecord ? urladd : urlmodify;
$('#dg').datagrid('getRowDetail',index).find('form').form('submit',{
url: url,
onSubmit: function(){
return $(this).form('validate');
},
success: function(data){
data = eval('('+data+')');
data.isNewRecord = false;
$('#dg').datagrid('collapseRow',index);
$('#dg').datagrid('updateRow',{
index: index,
row: data
});
$('#dg').datagrid('reload');
}
});
}
实现cancelItem()方法:
function cancelItem(index){
var row = $('#dg').datagrid('getRows')[index];
if (row.isNewRecord){
$('#dg').datagrid('deleteRow',index);
} else {
$('#dg').datagrid('collapseRow',index);
}
}
实现destroyItem()方法:
function destroyItem(){
var row = $('#dg').datagrid('getSelected');
var url = './data/crud/userAction.php?flag=delete';
if (row){
$.messager.confirm('Confirm','你确定要删除【'+row.lname+row.fname+'】么?',function(r){
if (r){
var index = $('#dg').datagrid('getRowIndex',row);
$.post(url,{id:row.id},function(){
$('#dg').datagrid('deleteRow',index);
});
}
});
}
}
最后附上源码:
datagrid-detailview.js
$.extend($.fn.datagrid.defaults, { autoUpdateDetail: true // Define if update the row detail content when update a row }); var detailview = $.extend({}, $.fn.datagrid.defaults.view, { render: function(target, container, frozen){ var state = $.data(target, 'datagrid'); var opts = state.options; if (frozen){ if (!(opts.rownumbers || (opts.frozenColumns && opts.frozenColumns.length))){ return; } } var rows = state.data.rows; var fields = $(target).datagrid('getColumnFields', frozen); var table = []; table.push('<table class="datagrid-btable" cellspacing="0" cellpadding="0" border="0"><tbody>'); for(var i=0; i<rows.length; i++) { // get the class and style attributes for this row var css = opts.rowStyler ? opts.rowStyler.call(target, i, rows[i]) : ''; var classValue = ''; var styleValue = ''; if (typeof css == 'string'){ styleValue = css; } else if (css){ classValue = css['class'] || ''; styleValue = css['style'] || ''; } var cls = 'class="datagrid-row ' + (i % 2 && opts.striped ? 'datagrid-row-alt ' : ' ') + classValue + '"'; var style = styleValue ? 'style="' + styleValue + '"' : ''; var rowId = state.rowIdPrefix + '-' + (frozen?1:2) + '-' + i; table.push('<tr id="' + rowId + '" datagrid-row-index="' + i + '" ' + cls + ' ' + style + '>'); table.push(this.renderRow.call(this, target, fields, frozen, i, rows[i])); table.push('</tr>'); table.push('<tr style="display:none;">'); if (frozen){ table.push('<td colspan=' + (fields.length+(opts.rownumbers?1:0)) + ' style="border-right:0">'); } else { table.push('<td colspan=' + (fields.length) + '>'); } table.push('<div class="datagrid-row-detail">'); if (frozen){ table.push(' '); } else { table.push(opts.detailFormatter.call(target, i, rows[i])); } table.push('</div>'); table.push('</td>'); table.push('</tr>'); } table.push('</tbody></table>'); $(container).html(table.join('')); }, renderRow: function(target, fields, frozen, rowIndex, rowData){ var opts = $.data(target, 'datagrid').options; var cc = []; if (frozen && opts.rownumbers){ var rownumber = rowIndex + 1; if (opts.pagination){ rownumber += (opts.pageNumber-1)*opts.pageSize; } cc.push('<td class="datagrid-td-rownumber"><div class="datagrid-cell-rownumber">'+rownumber+'</div></td>'); } for(var i=0; i<fields.length; i++){ var field = fields[i]; var col = $(target).datagrid('getColumnOption', field); if (col){ var value = rowData[field]; // the field value var css = col.styler ? (col.styler(value, rowData, rowIndex)||'') : ''; var classValue = ''; var styleValue = ''; if (typeof css == 'string'){ styleValue = css; } else if (cc){ classValue = css['class'] || ''; styleValue = css['style'] || ''; } var cls = classValue ? 'class="' + classValue + '"' : ''; var style = col.hidden ? 'style="display:none;' + styleValue + '"' : (styleValue ? 'style="' + styleValue + '"' : ''); cc.push('<td field="' + field + '" ' + cls + ' ' + style + '>'); if (col.checkbox){ style = ''; } else if (col.expander){ style = "text-align:center;height:16px;"; } else { style = styleValue; if (col.align){style += ';text-align:' + col.align + ';'} if (!opts.nowrap){ style += ';white-space:normal;height:auto;'; } else if (opts.autoRowHeight){ style += ';height:auto;'; } } cc.push('<div style="' + style + '" '); if (col.checkbox){ cc.push('class="datagrid-cell-check '); } else { cc.push('class="datagrid-cell ' + col.cellClass); } cc.push('">'); if (col.checkbox){ cc.push('<input type="checkbox" name="' + field + '" value="' + (value!=undefined ? value : '') + '">'); } else if (col.expander) { //cc.push('<div style="text-align:center;width:16px;height:16px;">'); cc.push('<span class="datagrid-row-expander datagrid-row-expand" style="display:inline-block;width:16px;height:16px;cursor:pointer;" />'); //cc.push('</div>'); } else if (col.formatter){ cc.push(col.formatter(value, rowData, rowIndex)); } else { cc.push(value); } cc.push('</div>'); cc.push('</td>'); } } return cc.join(''); }, insertRow: function(target, index, row){ var opts = $.data(target, 'datagrid').options; var dc = $.data(target, 'datagrid').dc; var panel = $(target).datagrid('getPanel'); var view1 = dc.view1; var view2 = dc.view2; var isAppend = false; var rowLength = $(target).datagrid('getRows').length; if (rowLength == 0){ $(target).datagrid('loadData',{total:1,rows:[row]}); return; } if (index == undefined || index == null || index >= rowLength) { index = rowLength; isAppend = true; this.canUpdateDetail = false; } $.fn.datagrid.defaults.view.insertRow.call(this, target, index, row); _insert(true); _insert(false); this.canUpdateDetail = true; function _insert(frozen){ var tr = opts.finder.getTr(target, index, 'body', frozen?1:2); if (isAppend){ var detail = tr.next(); var newDetail = tr.next().clone(); tr.insertAfter(detail); } else { var newDetail = tr.next().next().clone(); } newDetail.insertAfter(tr); newDetail.hide(); if (!frozen){ newDetail.find('div.datagrid-row-detail').html(opts.detailFormatter.call(target, index, row)); } } }, deleteRow: function(target, index){ var opts = $.data(target, 'datagrid').options; var dc = $.data(target, 'datagrid').dc; var tr = opts.finder.getTr(target, index); tr.next().remove(); $.fn.datagrid.defaults.view.deleteRow.call(this, target, index); dc.body2.triggerHandler('scroll'); }, updateRow: function(target, rowIndex, row){ var dc = $.data(target, 'datagrid').dc; var opts = $.data(target, 'datagrid').options; var cls = $(target).datagrid('getExpander', rowIndex).attr('class'); $.fn.datagrid.defaults.view.updateRow.call(this, target, rowIndex, row); $(target).datagrid('getExpander', rowIndex).attr('class',cls); // update the detail content if (opts.autoUpdateDetail && this.canUpdateDetail){ var row = $(target).datagrid('getRows')[rowIndex]; var detail = $(target).datagrid('getRowDetail', rowIndex); detail.html(opts.detailFormatter.call(target, rowIndex, row)); } }, bindEvents: function(target){ var state = $.data(target, 'datagrid'); if (state.ss.bindDetailEvents){return;} state.ss.bindDetailEvents = true; var dc = state.dc; var opts = state.options; var body = dc.body1.add(dc.body2); var clickHandler = ($.data(body[0],'events')||$._data(body[0],'events')).click[0].handler; body.unbind('click').bind('click', function(e){ var tt = $(e.target); var tr = tt.closest('tr.datagrid-row'); if (!tr.length){return} if (tt.hasClass('datagrid-row-expander')){ var rowIndex = parseInt(tr.attr('datagrid-row-index')); if (tt.hasClass('datagrid-row-expand')){ $(target).datagrid('expandRow', rowIndex); } else { $(target).datagrid('collapseRow', rowIndex); } $(target).datagrid('fixRowHeight'); } else { clickHandler(e); } e.stopPropagation(); }); }, onBeforeRender: function(target){ var state = $.data(target, 'datagrid'); var opts = state.options; var dc = state.dc; var t = $(target); var hasExpander = false; var fields = t.datagrid('getColumnFields',true).concat(t.datagrid('getColumnFields')); for(var i=0; i<fields.length; i++){ var col = t.datagrid('getColumnOption', fields[i]); if (col.expander){ hasExpander = true; break; } } if (!hasExpander){ if (opts.frozenColumns && opts.frozenColumns.length){ opts.frozenColumns[0].splice(0,0,{field:'_expander',expander:true,width:24,resizable:false,fixed:true}); } else { opts.frozenColumns = [[{field:'_expander',expander:true,width:24,resizable:false,fixed:true}]]; } var t = dc.view1.children('div.datagrid-header').find('table'); var td = $('<td rowspan="'+opts.frozenColumns.length+'"><div class="datagrid-header-expander" style="width:24px;"></div></td>'); if ($('tr',t).length == 0){ td.wrap('<tr></tr>').parent().appendTo($('tbody',t)); } else if (opts.rownumbers){ td.insertAfter(t.find('td:has(div.datagrid-header-rownumber)')); } else { td.prependTo(t.find('tr:first')); } } // if (!state.bindDetailEvents){ // state.bindDetailEvents = true; // var that = this; // setTimeout(function(){ // that.bindEvents(target); // },0); // } }, onAfterRender: function(target){ var that = this; var state = $.data(target, 'datagrid'); var dc = state.dc; var opts = state.options; var panel = $(target).datagrid('getPanel'); $.fn.datagrid.defaults.view.onAfterRender.call(this, target); if (!state.onResizeColumn){ state.onResizeColumn = opts.onResizeColumn; } if (!state.onResize){ state.onResize = opts.onResize; } function resizeDetails(){ var ht = dc.header2.find('table'); var fr = ht.find('tr.datagrid-filter-row').hide(); var ww = ht.width()-1; var details = dc.body2.find('>table.datagrid-btable>tbody>tr>td>div.datagrid-row-detail:visible')._outerWidth(ww); // var details = dc.body2.find('div.datagrid-row-detail:visible')._outerWidth(ww); details.find('.easyui-fluid').trigger('_resize'); fr.show(); } opts.onResizeColumn = function(field, width){ if (!opts.fitColumns){ resizeDetails(); } var rowCount = $(target).datagrid('getRows').length; for(var i=0; i<rowCount; i++){ $(target).datagrid('fixDetailRowHeight', i); } // call the old event code state.onResizeColumn.call(target, field, width); }; opts.onResize = function(width, height){ if (opts.fitColumns){ resizeDetails(); } state.onResize.call(panel, width, height); }; this.canUpdateDetail = true; // define if to update the detail content when 'updateRow' method is called; var footer = dc.footer1.add(dc.footer2); footer.find('span.datagrid-row-expander').css('visibility', 'hidden'); $(target).datagrid('resize'); this.bindEvents(target); var detail = dc.body1.add(dc.body2).find('div.datagrid-row-detail'); detail.unbind().bind('mouseover mouseout click dblclick contextmenu scroll', function(e){ e.stopPropagation(); }); } }); $.extend($.fn.datagrid.methods, { fixDetailRowHeight: function(jq, index){ return jq.each(function(){ var opts = $.data(this, 'datagrid').options; if (!(opts.rownumbers || (opts.frozenColumns && opts.frozenColumns.length))){ return; } var dc = $.data(this, 'datagrid').dc; var tr1 = opts.finder.getTr(this, index, 'body', 1).next(); var tr2 = opts.finder.getTr(this, index, 'body', 2).next(); // fix the detail row height if (tr2.is(':visible')){ tr1.css('height', ''); tr2.css('height', ''); var height = Math.max(tr1.height(), tr2.height()); tr1.css('height', height); tr2.css('height', height); } dc.body2.triggerHandler('scroll'); }); }, getExpander: function(jq, index){ // get row expander object var opts = $.data(jq[0], 'datagrid').options; return opts.finder.getTr(jq[0], index).find('span.datagrid-row-expander'); }, // get row detail container getRowDetail: function(jq, index){ var opts = $.data(jq[0], 'datagrid').options; var tr = opts.finder.getTr(jq[0], index, 'body', 2); // return tr.next().find('div.datagrid-row-detail'); return tr.next().find('>td>div.datagrid-row-detail'); }, expandRow: function(jq, index){ return jq.each(function(){ var opts = $(this).datagrid('options'); var dc = $.data(this, 'datagrid').dc; var expander = $(this).datagrid('getExpander', index); if (expander.hasClass('datagrid-row-expand')){ expander.removeClass('datagrid-row-expand').addClass('datagrid-row-collapse'); var tr1 = opts.finder.getTr(this, index, 'body', 1).next(); var tr2 = opts.finder.getTr(this, index, 'body', 2).next(); tr1.show(); tr2.show(); $(this).datagrid('fixDetailRowHeight', index); if (opts.onExpandRow){ var row = $(this).datagrid('getRows')[index]; opts.onExpandRow.call(this, index, row); } } }); }, collapseRow: function(jq, index){ return jq.each(function(){ var opts = $(this).datagrid('options'); var dc = $.data(this, 'datagrid').dc; var expander = $(this).datagrid('getExpander', index); if (expander.hasClass('datagrid-row-collapse')){ expander.removeClass('datagrid-row-collapse').addClass('datagrid-row-expand'); var tr1 = opts.finder.getTr(this, index, 'body', 1).next(); var tr2 = opts.finder.getTr(this, index, 'body', 2).next(); tr1.hide(); tr2.hide(); dc.body2.triggerHandler('scroll'); if (opts.onCollapseRow){ var row = $(this).datagrid('getRows')[index]; opts.onCollapseRow.call(this, index, row); } } }); } }); $.extend($.fn.datagrid.methods, { subgrid: function(jq, conf){ return jq.each(function(){ createGrid(this, conf); function createGrid(target, conf, prow){ var queryParams = $.extend({}, conf.options.queryParams||{}); // queryParams[conf.options.foreignField] = prow ? prow[conf.options.foreignField] : undefined; if (prow){ var fk = conf.options.foreignField; if ($.isFunction(fk)){ $.extend(queryParams, fk.call(conf, prow)); } else { queryParams[fk] = prow[fk]; } } var plugin = conf.options.edatagrid ? 'edatagrid' : 'datagrid'; $(target)[plugin]($.extend({}, conf.options, { subgrid: conf.subgrid, view: (conf.subgrid ? detailview : undefined), queryParams: queryParams, detailFormatter: function(index, row){ return '<div><table class="datagrid-subgrid"></table></div>'; }, onExpandRow: function(index, row){ var opts = $(this).datagrid('options'); var rd = $(this).datagrid('getRowDetail', index); var dg = getSubGrid(rd); if (!dg.data('datagrid')){ createGrid(dg[0], opts.subgrid, row); } rd.find('.easyui-fluid').trigger('_resize'); setHeight(this, index); if (conf.options.onExpandRow){ conf.options.onExpandRow.call(this, index, row); } }, onCollapseRow: function(index, row){ setHeight(this, index); if (conf.options.onCollapseRow){ conf.options.onCollapseRow.call(this, index, row); } }, onResize: function(){ var dg = $(this).children('div.datagrid-view').children('table') setParentHeight(this); }, onResizeColumn: function(field, width){ setParentHeight(this); if (conf.options.onResizeColumn){ conf.options.onResizeColumn.call(this, field, width); } }, onLoadSuccess: function(data){ setParentHeight(this); if (conf.options.onLoadSuccess){ conf.options.onLoadSuccess.call(this, data); } } })); } function getSubGrid(rowDetail){ var div = $(rowDetail).children('div'); if (div.children('div.datagrid').length){ return div.find('>div.datagrid>div.panel-body>div.datagrid-view>table.datagrid-subgrid'); } else { return div.find('>table.datagrid-subgrid'); } } function setParentHeight(target){ var tr = $(target).closest('div.datagrid-row-detail').closest('tr').prev(); if (tr.length){ var index = parseInt(tr.attr('datagrid-row-index')); var dg = tr.closest('div.datagrid-view').children('table'); setHeight(dg[0], index); } } function setHeight(target, index){ $(target).datagrid('fixDetailRowHeight', index); $(target).datagrid('fixRowHeight', index); var tr = $(target).closest('div.datagrid-row-detail').closest('tr').prev(); if (tr.length){ var index = parseInt(tr.attr('datagrid-row-index')); var dg = tr.closest('div.datagrid-view').children('table'); setHeight(dg[0], index); } } }); }, getSelfGrid: function(jq){ var grid = jq.closest('.datagrid'); if (grid.length){ return grid.find('>.datagrid-wrap>.datagrid-view>.datagrid-f'); } else { return null; } }, getParentGrid: function(jq){ var detail = jq.closest('div.datagrid-row-detail'); if (detail.length){ return detail.closest('.datagrid-view').children('.datagrid-f'); } else { return null; } }, getParentRowIndex: function(jq){ var detail = jq.closest('div.datagrid-row-detail'); if (detail.length){ var tr = detail.closest('tr').prev(); return parseInt(tr.attr('datagrid-row-index')); } else { return -1; } } });
show_form.php
<form method="post"> <table class="dv-table" style="width:100%;background:#fafafa;padding:5px;margin-top:5px;"> <tr> <td>名</td> <td><input name="fname" class="easyui-validatebox" required="true"></input></td> <td>姓</td> <td><input name="lname" class="easyui-validatebox" required="true"></input></td> </tr> <tr> <td>性别</td> <td colspan="3"><input name="sex" class="easyui-validatebox" required="true"></input></td> </tr> <tr> <td>电话</td> <td><input name="phone"></input></td> <td>邮件</td> <td><input name="email" class="easyui-validatebox" validType="email"></input></td> </tr> </table> <div style="padding:5px 0;text-align:right;padding-right:30px"> <a href="#" class="easyui-linkbutton" iconCls="icon-save" plain="true" onclick="saveItem(<?php echo $_REQUEST['index'];?>)">Save</a> <a href="#" class="easyui-linkbutton" iconCls="icon-cancel" plain="true" onclick="cancelItem(<?php echo $_REQUEST['index'];?>)">Cancel</a> </div> </form>
bus_pubuser.js
/*****************开始 表格显示明细编辑*******************/ function saveItem(index){ var row = $('#dg').datagrid('getRows')[index]; var urladd = './data/crud/userAction.php?flag=add'; var urlmodify = './data/crud/userAction.php?flag=modify&id='+row.id; var url = row.isNewRecord ? urladd : urlmodify; $('#dg').datagrid('getRowDetail',index).find('form').form('submit',{ url: url, onSubmit: function(){ return $(this).form('validate'); }, success: function(data){ data = eval('('+data+')'); data.isNewRecord = false; $('#dg').datagrid('collapseRow',index); $('#dg').datagrid('updateRow',{ index: index, row: data }); $('#dg').datagrid('reload'); } }); } function cancelItem(index){ var row = $('#dg').datagrid('getRows')[index]; if (row.isNewRecord){ $('#dg').datagrid('deleteRow',index); } else { $('#dg').datagrid('collapseRow',index); } } function destroyItem(){ var row = $('#dg').datagrid('getSelected'); var url = './data/crud/userAction.php?flag=delete'; if (row){ $.messager.confirm('Confirm','你确定要删除【'+row.lname+row.fname+'】么?',function(r){ if (r){ var index = $('#dg').datagrid('getRowIndex',row); $.post(url,{id:row.id},function(){ $('#dg').datagrid('deleteRow',index); }); } }); } } function newItem(){ $('#dg').datagrid('appendRow',{isNewRecord:true}); var index = $('#dg').datagrid('getRows').length - 1; $('#dg').datagrid('expandRow', index); $('#dg').datagrid('selectRow', index); }
index.php
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>创建展开行明细编辑表单</title> <link rel="stylesheet" type="text/css" href="../ui/jquery-easyui-1.4.5/themes/default/easyui.css"> <link rel="stylesheet" type="text/css" href="../ui/jquery-easyui-1.4.5/themes/icon.css"> <link rel="stylesheet" type="text/css" href="../ui/jquery-easyui-1.4.5/themes/color.css"> <script src="../ui/jquery-easyui-1.4.5/jquery.min.js"></script> <script src="../ui/jquery-easyui-1.4.5/jquery.easyui.min.js"></script> <script src="../js/crud/datagrid-detailview.js"></script> <script src="../ui/jquery-easyui-1.4.5/locale/easyui-lang-zh_CN.js"></script> <script src="../js/crud/bus_pubuser.js"></script> <script> $(function(){ // $('#dg').edatagrid({ // url: './data/crud/userAction.php?flag=list', // saveUrl: './data/crud/userAction.php?flag=add', // updateUrl: './data/crud/userAction.php?flag=modify', // destroyUrl: './data/crud/userAction.php?flag=delete' // }); $('#dg').datagrid({ view: detailview, detailFormatter:function(index,row){ return '<div class="ddv"></div>'; }, onExpandRow: function(index,row){ var ddv = $(this).datagrid('getRowDetail',index).find('div.ddv'); ddv.panel({ border:false, cache:true, href:'./page/show_form.php?index='+index, onLoad:function(){ $('#dg').datagrid('fixDetailRowHeight',index); $('#dg').datagrid('selectRow',index); $('#dg').datagrid('getRowDetail',index).find('form').form('load',row); } }); $('#dg').datagrid('fixDetailRowHeight',index); } }); }); </script> </head> <body> <!-- 作者:ethancoco 时间:2016-07-10 描述:list --> <table id="dg" title="用户列表" class="easyui-datagrid" url="./data/crud/userAction.php?flag=list" style="width:100%;height: 600px;" toolbar="#toolbar" rownumbers="true" pagination="true" fitColumns="true" singleSelect="true"> <thead> <tr> <th field="fname" width="50" >名</th> <th field="lname" width="50" >姓</th> <th field="sex" width="50" >性别</th> <th field="phone" width="50" >联系电话</th> <th field="email" width="50" >邮件</th> </tr> </thead> </table> <div id="toolbar"> <a href="#" class="easyui-linkbutton" iconCls="icon-add" plain="true" onclick="newItem()">添加</a> <a href="#" class="easyui-linkbutton" iconCls="icon-remove" plain="true" onclick="destroyItem()">删除</a> </div> <!-- 作者:ethancoco 时间:2016-07-10 描述:dialog --> <!--<div id="dlg" class="easyui-dialog" style="width:400px;height:320px;padding:10px 20px;" closed="true" modal="true" buttons="#dlg-buttons"> <div class="ftitle">基本信息</div> <hr /> <form id="fm" method="post"> <div class="fitem"> <p> <label>First Name:</label> <input name="fname" class="easyui-validatebox" required="true"> </p> </div> <div class="fitem"> <p> <label>Last Name:</label> <input name="lname" class="easyui-validatebox" required="true"> </p> </div> <div class="fitem"> <p> <label>Sex:</label> <input name="sex" class="easyui-validatebox" required="true"> </p> </div> <div class="fitem"> <p> <label>Phone:</label> <input name="phone"> </p> </div> <div class="fitem"> <p> <label>Email:</label> <input name="email" class="easyui-validatebox" validType="email"> </p> </div> </form> </div> <div id="dlg-buttons"> <a href="#" class="easyui-linkbutton" iconCls="icon-ok" onclick="saveUser()">保存</a> <a href="#" class="easyui-linkbutton" iconCls="icon-cancel" onclick="javascript:$('#dlg').dialog('close')">关闭</a> </div>--> </body> <html>
posted on 2016-07-10 21:06 EthanCoco 阅读(2925) 评论(0) 编辑 收藏 举报