[转载]Easyui1.32源码翻译–datagrid(数据表格) – Jimmy-Lee – 博客园.
此前网上有easyui1.25的源码 应该算是比较老的版本 之后又经历了1.26 、 1.3、 1.31、 1.32 、1.33、1.34 1.33开始支持css3 算是又一个转折 但是对于ie来说 1.32 个人用的比较多 赶紧更适用 源码翻译是作者利用几个夜晚时间翻译的 这个表格插件算是源码量最大的 先发布这个 之后会继续把整个easyui的插件翻译完毕:下载该插件翻译源码地址
/** * jQuery EasyUI 1.3.2 * 翻译:qq:1364386878 * */ (function ($) { var grid_body_tr_idindex = 0; //获取对象下标 function getObjectIndex(a, o) { for (var i = 0, _3 = a.length; i < _3; i++) { if (a[i] == o) { return i; } } return -1; }; //根据id取消选择行 function unSelectedRowsById(a, o, id) { if (typeof o == "string") { for (var i = 0, rows = a.length; i < rows; i++) { if (a[i][o] == id) { a.splice(i, 1); return; } } } else { var index = getObjectIndex(a, o); if (index != -1) { a.splice(index, 1); } } }; //返回标识字段列 function idFieldRows(scRows, idfield, row) { for (var i = 0, rlength = scRows.length; i < rlength; i++) { if (scRows[i][idfield] == row[idfield]) { return; } } scRows.push(row); }; //做调整和布局 function _resize(target, parm) { var opts = $.data(target, "datagrid").options; var panel = $.data(target, "datagrid").panel; if (parm) { if (parm.width) { opts.width = parm.width; } if (parm.height) { opts.height = parm.height; } } if (opts.fit == true) { var p = panel.panel("panel").parent(); opts.width = p.width(); opts.height = p.height(); } panel.panel("resize", { width: opts.width, height: opts.height }); }; //适应大小 function _fitGridSize(jq) { var opts = $.data(jq, "datagrid").options; var dc = $.data(jq, "datagrid").dc; var panel = $.data(jq, "datagrid").panel; var width = panel.width(); var height = panel.height(); var gridView = dc.view; var gridView1 = dc.view1; var gridView2 = dc.view2; var gridHeader1 = gridView1.children("div.datagrid-header"); var gridHeader2 = gridView2.children("div.datagrid-header"); var gridTable1 = gridHeader1.find("table"); var gridTable2 = gridHeader2.find("table"); gridView.width(width); var innerHeader = gridHeader1.children("div.datagrid-header-inner").show(); gridView1.width(innerHeader.find("table").width()); if (!opts.showHeader) { innerHeader.hide(); } gridView2.width(width - gridView1._outerWidth()); gridView1.children("div.datagrid-header,div.datagrid-body,div.datagrid-footer").width(gridView1.width()); gridView2.children("div.datagrid-header,div.datagrid-body,div.datagrid-footer").width(gridView2.width()); var hh; gridHeader1.css("height", ""); gridHeader2.css("height", ""); gridTable1.css("height", ""); gridTable2.css("height", ""); hh = Math.max(gridTable1.height(), gridTable2.height()); gridTable1.height(hh); gridTable2.height(hh); gridHeader1.add(gridHeader2)._outerHeight(hh); if (opts.height != "auto") { var fixedHeight = height - gridView2.children("div.datagrid-header")._outerHeight() - gridView2.children("div.datagrid-footer")._outerHeight() - panel.children("div.datagrid-toolbar")._outerHeight(); panel.children("div.datagrid-pager").each(function () { fixedHeight -= $(this)._outerHeight(); }); dc.body1.add(dc.body2).children("table.datagrid-btable-frozen").css({ position: "absolute", top: dc.header2._outerHeight() }); var height = dc.body2.children("table.datagrid-btable-frozen")._outerHeight(); gridView1.add(gridView2).children("div.datagrid-body").css({ marginTop: height, height: (fixedHeight - height) }); } gridView.height(gridView2.height()); }; //固定指定列高度。如果'index'参数未配置,所有行高度都是固定的 function _fixRowHeight(target, index, _21) { var rows = $.data(target, "datagrid").data.rows; var opts = $.data(target, "datagrid").options; var dc = $.data(target, "datagrid").dc; if (!dc.body1.is(":empty") && (!opts.nowrap || opts.autoRowHeight || _21)) { if (index != undefined) { var tr1 = opts.finder.getTr(target, index, "body", 1); var tr2 = opts.finder.getTr(target, index, "body", 2); alignRowHeight(tr1, tr2); } else { var tr1 = opts.finder.getTr(target, 0, "allbody", 1); var tr2 = opts.finder.getTr(target, 0, "allbody", 2); alignRowHeight(tr1, tr2); if (opts.showFooter) { var tr1 = opts.finder.getTr(target, 0, "allfooter", 1); var tr2 = opts.finder.getTr(target, 0, "allfooter", 2); alignRowHeight(tr1, tr2); } } } _fitGridSize(target); if (opts.height == "auto") { var gridBody1 = dc.body1.parent(); var gridBody2 = dc.body2; var fullHeight = 0; var width = 0; gridBody2.children().each(function () { var c = $(this); if (c.is(":visible")) { fullHeight += c._outerHeight(); if (width < c._outerWidth()) { width = c._outerWidth(); } } }); if (width > gridBody2.width()) { fullHeight += 18; } gridBody1.height(fullHeight); gridBody2.height(fullHeight); dc.view.height(dc.view2.height()); } dc.body2.triggerHandler("scroll"); function alignRowHeight(target1, target2) { for (var i = 0; i < target2.length; i++) { var tr1 = $(target1[i]); var tr2 = $(target2[i]); tr1.css("height", ""); tr2.css("height", ""); var height = Math.max(tr1.height(), tr2.height()); tr1.css("height", height); tr2.css("height", height); } }; }; //冻结指定行,当数据表格表格向下滚动的时候始终保持被冻结的行显示在顶部 function _freezeRow(target, index) { var datagrid = $.data(target, "datagrid"); var opts = datagrid.options; var dc = datagrid.dc; if (!dc.body2.children("table.datagrid-btable-frozen").length) { dc.body1.add(dc.body2).prepend("<table class=\"datagrid-btable datagrid-btable-frozen\" cellspacing=\"0\" cellpadding=\"0\"></table>"); } getfreeze_RowCells(true); getfreeze_RowCells(false); _fitGridSize(target); function getfreeze_RowCells(freezeColmuns) { var step = freezeColmuns ? 1 : 2; var tr = opts.finder.getTr(target, index, "body", step); (freezeColmuns ? dc.body1 : dc.body2).children("table.datagrid-btable-frozen").append(tr); }; }; function wrapGrid(target, rownumber) { function getcolumns() { var frozencols = []; var unfrozencols = []; $(target).children("thead").each(function () { var opt = $.parser.parseOptions(this, [{ frozen: "boolean" }]); $(this).find("tr").each(function () { var cols = []; $(this).find("th").each(function () { var th = $(this); var col = $.extend({}, $.parser.parseOptions(this, ["field", "align", "halign", "order", { sortable: "boolean", checkbox: "boolean", resizable: "boolean" }, { rowspan: "number", colspan: "number", width: "number" }]), { title: (th.html() || undefined), hidden: (th.attr("hidden") ? true : undefined), formatter: (th.attr("formatter") ? eval(th.attr("formatter")) : undefined), styler: (th.attr("styler") ? eval(th.attr("styler")) : undefined), sorter: (th.attr("sorter") ? eval(th.attr("sorter")) : undefined) }); if (th.attr("editor")) { var s = $.trim(th.attr("editor")); if (s.substr(0, 1) == "{") { col.editor = eval("(" + s + ")"); } else { col.editor = s; } } cols.push(col); }); opt.frozen ? frozencols.push(cols) : unfrozencols.push(cols); }); }); return [frozencols, unfrozencols]; }; var gridwrap = $("<div class=\"datagrid-wrap\">" + "<div class=\"datagrid-view\">" + "<div class=\"datagrid-view1\">" + "<div class=\"datagrid-header\">" + "<div class=\"datagrid-header-inner\"></div>" + "</div>" + "<div class=\"datagrid-body\">" + "<div class=\"datagrid-body-inner\"></div>" + "</div>" + "<div class=\"datagrid-footer\">" + "<div class=\"datagrid-footer-inner\"></div>" + "</div>" + "</div>" + "<div class=\"datagrid-view2\">" + "<div class=\"datagrid-header\">" + "<div class=\"datagrid-header-inner\"></div>" + "</div>" + "<div class=\"datagrid-body\"></div>" + "<div class=\"datagrid-footer\">" + "<div class=\"datagrid-footer-inner\"></div>" + "</div>" + "</div>" + "</div>" + "</div>").insertAfter(target); gridwrap.panel({ doSize: false }); gridwrap.panel("panel").addClass("datagrid").bind("_resize", function (e, param) { var opts = $.data(target, "datagrid").options; if (opts.fit == true || param) { _resize(target); setTimeout(function () { if ($.data(target, "datagrid")) { _fixColumnSize(target); } }, 0); } return false; }); $(target).hide().appendTo(gridwrap.children("div.datagrid-view")); var cc = getcolumns(); var gridView = gridwrap.children("div.datagrid-view"); var gridView1 = gridView.children("div.datagrid-view1"); var gridView2 = gridView.children("div.datagrid-view2"); return { panel: gridwrap, frozenColumns: cc[0], columns: cc[1], dc: { view: gridView, view1: gridView1, view2: gridView2, header1: gridView1.children("div.datagrid-header").children("div.datagrid-header-inner"), header2: gridView2.children("div.datagrid-header").children("div.datagrid-header-inner"), body1: gridView1.children("div.datagrid-body").children("div.datagrid-body-inner"), body2: gridView2.children("div.datagrid-body"), footer1: gridView1.children("div.datagrid-footer").children("div.datagrid-footer-inner"), footer2: gridView2.children("div.datagrid-footer").children("div.datagrid-footer-inner") } }; }; //获取表格数据 function getGridData(jq) { var data = { total: 0, rows: [] }; var fields = _getColumnFields(jq, true).concat(_getColumnFields(jq, false)); $(jq).find("tbody tr").each(function () { data.total++; var col = {}; for (var i = 0; i < fields.length; i++) { col[fields[i]] = $("td:eq(" + i + ")", this).html(); } data.rows.push(col); }); return data; }; //初始化 function init(jq) { var datagrid = $.data(jq, "datagrid"); var opts = datagrid.options; var dc = datagrid.dc; var panel = datagrid.panel; panel.panel($.extend({}, opts, { id: null, doSize: false, onResize: function (width, height) { setTimeout(function () { if ($.data(jq, "datagrid")) { _fitGridSize(jq); _fitColumns(jq); opts.onResize.call(panel, width, height); } }, 0); }, onExpand: function () { _fixRowHeight(jq); opts.onExpand.call(panel); } })); datagrid.rowIdPrefix = "datagrid-row-r" + (++grid_body_tr_idindex); buildGridHeader(dc.header1, opts.frozenColumns, true); buildGridHeader(dc.header2, opts.columns, false); cellWidth();//设置单元格宽度 dc.header1.add(dc.header2).css("display", opts.showHeader ? "block" : "none"); dc.footer1.add(dc.footer2).css("display", opts.showFooter ? "block" : "none"); if (opts.toolbar) { if (typeof opts.toolbar == "string") { $(opts.toolbar).addClass("datagrid-toolbar").prependTo(panel); $(opts.toolbar).show(); } else { $("div.datagrid-toolbar", panel).remove(); var tb = $("<div class=\"datagrid-toolbar\"><table cellspacing=\"0\" cellpadding=\"0\"><tr></tr></table></div>").prependTo(panel); var tr = tb.find("tr"); for (var i = 0; i < opts.toolbar.length; i++) { var btn = opts.toolbar[i]; if (btn == "-") { $("<td><div class=\"datagrid-btn-separator\"></div></td>").appendTo(tr); } else { var td = $("<td></td>").appendTo(tr); var tool = $("<a href=\"javascript:void(0)\"></a>").appendTo(td); tool[0].onclick = eval(btn.handler || function () { }); tool.linkbutton($.extend({}, btn, { plain: true })); } } } } else { $("div.datagrid-toolbar", panel).remove(); } $("div.datagrid-pager", panel).remove(); if (opts.pagination) { var pager = $("<div class=\"datagrid-pager\"></div>"); if (opts.pagePosition == "bottom") { pager.appendTo(panel); } else { if (opts.pagePosition == "top") { pager.addClass("datagrid-pager-top").prependTo(panel); } else { var pagertop = $("<div class=\"datagrid-pager datagrid-pager-top\"></div>").prependTo(panel); pager.appendTo(panel); pager = pager.add(pagertop); } } //分页 pager.pagination({ total: 0, pageNumber: opts.pageNumber, pageSize: opts.pageSize, pageList: opts.pageList, onSelectPage: function (pageNumber, pageSize) { opts.pageNumber = pageNumber; opts.pageSize = pageSize; pager.pagination("refresh", { pageNumber: pageNumber, pageSize: pageSize }); _load(jq); } }); opts.pageSize = pager.pagination("options").pageSize; } function buildGridHeader(headerDiv, clomuns, frozen) { if (!clomuns) { return; } $(headerDiv).show(); $(headerDiv).empty(); var t = $("<table class=\"datagrid-htable\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\"><tbody></tbody></table>").appendTo(headerDiv); for (var i = 0; i < clomuns.length; i++) { var tr = $("<tr class=\"datagrid-header-row\"></tr>").appendTo($("tbody", t)); var column = clomuns[i]; for (var j = 0; j < column.length; j++) { var col = column[j]; var tdHTML = ""; if (col.rowspan) { tdHTML += "rowspan=\"" + col.rowspan + "\" "; } if (col.colspan) { tdHTML += "colspan=\"" + col.colspan + "\" "; } var td = $("<td " + tdHTML + "></td>").appendTo(tr); if (col.checkbox) { td.attr("field", col.field); $("<div class=\"datagrid-header-check\"></div>").html("<input type=\"checkbox\"/>").appendTo(td); } else { if (col.field) { td.attr("field", col.field); td.append("<div class=\"datagrid-cell\"><span></span><span class=\"datagrid-sort-icon\"></span></div>"); $("span", td).html(col.title); $("span.datagrid-sort-icon", td).html(" "); var cell = td.find("div.datagrid-cell"); if (col.resizable == false) { cell.attr("resizable", "false"); } if (col.width) { cell._outerWidth(col.width); col.boxWidth = parseInt(cell[0].style.width); } else { col.auto = true; } cell.css("text-align", (col.halign || col.align || "")); col.cellClass = "datagrid-cell-c" + grid_body_tr_idindex + "-" + col.field.replace(/\./g, "-"); col.cellSelector = "div." + col.cellClass; } else { $("<div class=\"datagrid-cell-group\"></div>").html(col.title).appendTo(td); } } if (col.hidden) { td.hide(); } } } if (frozen && opts.rownumbers) { var td = $("<td rowspan=\"" + opts.frozenColumns.length + "\"><div class=\"datagrid-header-rownumber\"></div></td>"); if ($("tr", t).length == 0) { td.wrap("<tr class=\"datagrid-header-row\"></tr>").parent().appendTo($("tbody", t)); } else { td.prependTo($("tr:first", t)); } } }; //设置单元格宽度 function cellWidth() { var ss = ["<style type=\"text/css\">"]; var clomuns = _getColumnFields(jq, true).concat(_getColumnFields(jq)); for (var i = 0; i < clomuns.length; i++) { var col = _getColumnOption(jq, clomuns[i]); if (col && !col.checkbox) { ss.push(col.cellSelector + " {width:" + col.boxWidth + "px;}"); } } ss.push("</style>"); $(ss.join("\n")).prependTo(dc.view); }; }; //绑定事件 function bingEvent(jq) { var datagrid = $.data(jq, "datagrid"); var panel = datagrid.panel; var opts = datagrid.options; var dc = datagrid.dc; var headinner = dc.header1.add(dc.header2); //点击checkbox事件 headinner.find("input[type=checkbox]").unbind(".datagrid").bind("click.datagrid", function (e) { if (opts.singleSelect && opts.selectOnCheck) { return false; } if ($(this).is(":checked")) { _checkAll(jq); } else { _clearChecked(jq); } e.stopPropagation(); }); var gridcell = headinner.find("div.datagrid-cell"); //鼠标进入标题单元格事件 gridcell.closest("td").unbind(".datagrid").bind("mouseenter.datagrid", function () { if (datagrid.resizing) { return; } $(this).addClass("datagrid-header-over"); }).bind("mouseleave.datagrid", function () { //鼠标离开标题事件 $(this).removeClass("datagrid-header-over"); }).bind("contextmenu.datagrid", function (e) {//鼠标右键标题事件 var field = $(this).attr("field"); opts.onHeaderContextMenu.call(jq, e, field); }); //点击titl事件 gridcell.unbind(".datagrid").bind("click.datagrid", function (e) { var p1 = $(this).offset().left + 5; var p2 = $(this).offset().left + $(this)._outerWidth() - 5; if (e.pageX < p2 && e.pageX > p1) { var field = $(this).parent().attr("field"); var col = _getColumnOption(jq, field);////返回指定列属性 if (!col.sortable || datagrid.resizing) { return; } opts.sortName = field; opts.sortOrder = col.order || "asc"; var cls = "datagrid-sort-" + opts.sortOrder; if ($(this).hasClass("datagrid-sort-asc")) { cls = "datagrid-sort-desc"; opts.sortOrder = "desc"; } else { if ($(this).hasClass("datagrid-sort-desc")) { cls = "datagrid-sort-asc"; opts.sortOrder = "asc"; } } gridcell.removeClass("datagrid-sort-asc datagrid-sort-desc"); $(this).addClass(cls); if (opts.remoteSort) { _load(jq); } else { var data = $.data(jq, "datagrid").data; _removeData(jq, data); } opts.onSortColumn.call(jq, opts.sortName, opts.sortOrder); } }).bind("dblclick.datagrid", function (e) {//双击事件 var p1 = $(this).offset().left + 5; var p2 = $(this).offset().left + $(this)._outerWidth() - 5; var resizeHandle = opts.resizeHandle == "right" ? (e.pageX > p2) : (opts.resizeHandle == "left" ? (e.pageX < p1) : (e.pageX < p1 || e.pageX > p2)); if (resizeHandle) { var field = $(this).parent().attr("field"); var col = _getColumnOption(jq, field); if (col.resizable == false) { return; } $(jq).datagrid("autoSizeColumn", field); col.auto = false; } }); var resizeHandle = opts.resizeHandle == "right" ? "e" : (opts.resizeHandle == "left" ? "w" : "e,w"); gridcell.each(function () { $(this).resizable({ handles: resizeHandle, disabled: ($(this).attr("resizable") ? $(this).attr("resizable") == "false" : false), minWidth: 25, onStartResize: function (e) { datagrid.resizing = true; headinner.css("cursor", $("body").css("cursor")); if (!datagrid.proxy) { datagrid.proxy = $("<div class=\"datagrid-resize-proxy\"></div>").appendTo(dc.view); } datagrid.proxy.css({ left: e.pageX - $(panel).offset().left - 1, display: "none" }); setTimeout(function () { if (datagrid.proxy) { datagrid.proxy.show(); } }, 500); }, onResize: function (e) { datagrid.proxy.css({ left: e.pageX - $(panel).offset().left - 1, display: "block" }); return false; }, onStopResize: function (e) { headinner.css("cursor", ""); var field = $(this).parent().attr("field"); var col = _getColumnOption(jq, field); col.width = $(this)._outerWidth(); col.boxWidth = parseInt(this.style.width); col.auto = undefined; _fixColumnSize(jq, field); datagrid.proxy.remove(); datagrid.proxy = null; if ($(this).parents("div:first.datagrid-header").parent().hasClass("datagrid-view1")) { _fitGridSize(jq); } _fitColumns(jq); opts.onResizeColumn.call(jq, field, col.width); setTimeout(function () { datagrid.resizing = false; }, 0); } }); }); //grid body 鼠标进入事件 dc.body1.add(dc.body2).unbind().bind("mouseover", function (e) { if (datagrid.resizing) { return; } var tr = $(e.target).closest("tr.datagrid-row"); if (!tr.length) { return; } var index = get_trIndex(tr); opts.finder.getTr(jq, index).addClass("datagrid-row-over"); e.stopPropagation(); }).bind("mouseout", function (e) { //grid body 鼠标移出事件 var tr = $(e.target).closest("tr.datagrid-row"); if (!tr.length) { return; } var index = get_trIndex(tr); opts.finder.getTr(jq, index).removeClass("datagrid-row-over"); e.stopPropagation(); }).bind("click", function (e) { //grid body 鼠标点击事件 var tt = $(e.target); var tr = tt.closest("tr.datagrid-row"); if (!tr.length) { return; } var index = get_trIndex(tr); if (tt.parent().hasClass("datagrid-cell-check")) { if (opts.singleSelect && opts.selectOnCheck) { if (!opts.checkOnSelect) { _clearChecked(jq, true); } _checkRow(jq, index); } else { if (tt.is(":checked")) { _checkRow(jq, index); } else { _uncheckRow(jq, index); } } } else { var row = opts.finder.getRow(jq, index); var td = tt.closest("td[field]", tr); if (td.length) { var _6f = td.attr("field"); opts.onClickCell.call(jq, index, _6f, row[_6f]); } if (opts.singleSelect == true) { _selectRow(jq, index); } else { if (tr.hasClass("datagrid-row-selected")) { _unselectRow(jq, index); } else { _selectRow(jq, index); } } opts.onClickRow.call(jq, index, row); } e.stopPropagation(); }).bind("dblclick", function (e) {//grid body 鼠标双击事件 var tt = $(e.target); var tr = tt.closest("tr.datagrid-row"); if (!tr.length) { return; } var index = get_trIndex(tr); var row = opts.finder.getRow(jq, index); var td = tt.closest("td[field]", tr); if (td.length) { var field = td.attr("field"); opts.onDblClickCell.call(jq, index, field, row[field]); } opts.onDblClickRow.call(jq, index, row); e.stopPropagation(); }).bind("contextmenu", function (e) {//grid body 鼠标右键事件 var tr = $(e.target).closest("tr.datagrid-row"); if (!tr.length) { return; } var index = get_trIndex(tr); var row = opts.finder.getRow(jq, index); opts.onRowContextMenu.call(jq, e, index, row); e.stopPropagation(); }); dc.body2.bind("scroll", function () {//grid body 滚动条事件 dc.view1.children("div.datagrid-body").scrollTop($(this).scrollTop()); dc.view2.children("div.datagrid-header,div.datagrid-footer")._scrollLeft($(this)._scrollLeft()); dc.body2.children("table.datagrid-btable-frozen").css("left", -$(this)._scrollLeft()); }); //获取td index function get_trIndex(tr) { if (tr.attr("datagrid-row-index")) { return parseInt(tr.attr("datagrid-row-index")); } else { return tr.attr("node-id"); } }; }; //使列自动展开/收缩到合适的数据表格宽度 function _fitColumns(jq) { var opts = $.data(jq, "datagrid").options; var dc = $.data(jq, "datagrid").dc; if (!opts.fitColumns) { return; } var header = dc.view2.children("div.datagrid-header"); var visableWidth = 0; var visableColumn; var fields = _getColumnFields(jq, false); for (var i = 0; i < fields.length; i++) { var col = _getColumnOption(jq, fields[i]); if (_7a(col)) { visableWidth += col.width; visableColumn = col; } } var innerHeader = header.children("div.datagrid-header-inner").show(); var fullWidth = header.width() - header.find("table").width() - opts.scrollbarSize; var rate = fullWidth / visableWidth; if (!opts.showHeader) { innerHeader.hide(); } for (var i = 0; i < fields.length; i++) { var col = _getColumnOption(jq, fields[i]); if (_7a(col)) { var width = Math.floor(col.width * rate); fitColumnWidth(col, width); fullWidth -= width; } } if (fullWidth && visableColumn) { fitColumnWidth(visableColumn, fullWidth); } _fixColumnSize(jq); function fitColumnWidth(col, _80) { col.width += _80; col.boxWidth += _80; header.find("td[field=\"" + col.field + "\"] div.datagrid-cell").width(col.boxWidth); }; function _7a(col) { if (!col.hidden && !col.checkbox && !col.auto) { return true; } }; }; //自动调整列宽度以适应内容 function _autoSizeColumn(jq, filed) { var opts = $.data(jq, "datagrid").options; var dc = $.data(jq, "datagrid").dc; if (filed) { _resize(filed); if (opts.fitColumns) { _fitGridSize(jq); _fitColumns(jq); } } else { var _85 = false; var _86 = _getColumnFields(jq, true).concat(_getColumnFields(jq, false)); for (var i = 0; i < _86.length; i++) { var filed = _86[i]; var col = _getColumnOption(jq, filed); if (col.auto) { _resize(filed); _85 = true; } } if (_85 && opts.fitColumns) { _fitGridSize(jq); _fitColumns(jq); } } function _resize(_87) { var _88 = dc.view.find("div.datagrid-header td[field=\"" + _87 + "\"] div.datagrid-cell"); _88.css("width", ""); var col = $(jq).datagrid("getColumnOption", _87); col.width = undefined; col.boxWidth = undefined; col.auto = true; $(jq).datagrid("fixColumnSize", _87); var _89 = Math.max(_88._outerWidth(), _8a("allbody"), _8a("allfooter")); _88._outerWidth(_89); col.width = _89; col.boxWidth = parseInt(_88[0].style.width); $(jq).datagrid("fixColumnSize", _87); opts.onResizeColumn.call(jq, _87, col.width); function _8a(_8b) { var _8c = 0; opts.finder.getTr(jq, 0, _8b).find("td[field=\"" + _87 + "\"] div.datagrid-cell").each(function () { var w = $(this)._outerWidth(); if (_8c < w) { _8c = w; } }); return _8c; }; }; }; //固定列大小。如果'field'参数未配置,所有列大小将都是固定的 function _fixColumnSize(jq, field) { var opts = $.data(jq, "datagrid").options; var dc = $.data(jq, "datagrid").dc; var vtable = dc.view.find("table.datagrid-btable,table.datagrid-ftable"); vtable.css("table-layout", "fixed"); if (field) { fix(field); } else { var ff = _getColumnFields(jq, true).concat(_getColumnFields(jq, false)); for (var i = 0; i < ff.length; i++) { fix(ff[i]); } } vtable.css("table-layout", "auto"); _91(jq); setTimeout(function () { _fixRowHeight(jq); fixEditorSize(jq); }, 0); function fix(field) { var col = _getColumnOption(jq, field); if (col.checkbox) { return; } var _93 = dc.view.children("style")[0]; var _94 = _93.styleSheet ? _93.styleSheet : (_93.sheet || document.styleSheets[document.styleSheets.length - 1]); var _95 = _94.cssRules || _94.rules; for (var i = 0, len = _95.length; i < len; i++) { var _96 = _95[i]; if (_96.selectorText.toLowerCase() == col.cellSelector.toLowerCase()) { _96.style["width"] = col.boxWidth ? col.boxWidth + "px" : "auto"; break; } } }; }; function _91(jq) { var dc = $.data(jq, "datagrid").dc; dc.body1.add(dc.body2).find("td.datagrid-td-merged").each(function () { var td = $(this); var colspan = td.attr("colspan") || 1; var width = _getColumnOption(jq, td.attr("field")).width; for (var i = 1; i < colspan; i++) { td = td.next(); width += _getColumnOption(jq, td.attr("field")).width + 1; } $(this).children("div.datagrid-cell")._outerWidth(width); }); }; function fixEditorSize(_9b) { var dc = $.data(_9b, "datagrid").dc; dc.view.find("div.datagrid-editable").each(function () { var _9c = $(this); var _9d = _9c.parent().attr("field"); var col = $(_9b).datagrid("getColumnOption", _9d); _9c._outerWidth(col.width); var ed = $.data(this, "datagrid.editor"); if (ed.actions.resize) { ed.actions.resize(ed.target, _9c.width()); } }); }; //返回指定列属性 function _getColumnOption(jq, filed) { function _a0(_a1) { if (_a1) { for (var i = 0; i < _a1.length; i++) { var cc = _a1[i]; for (var j = 0; j < cc.length; j++) { var c = cc[j]; if (c.field == filed) { return c; } } } } return null; }; var opts = $.data(jq, "datagrid").options; var col = _a0(opts.columns); if (!col) { col = _a0(opts.frozenColumns); } return col; }; //返回列字段。如果设置了frozen属性为true,将返回固定列的字段名 function _getColumnFields(jq, frozen) { var opts = $.data(jq, "datagrid").options; var columns = (frozen == true) ? (opts.frozenColumns || [[]]) : opts.columns; if (columns.length == 0) { return []; } var fields = []; function getFixedColspan(index) { var c = 0; var i = 0; while (true) { if (fields[i] == undefined) { if (c == index) { return i; } c++; } i++; } }; function findColumnFields(r) { var ff = []; var c = 0; for (var i = 0; i < columns[r].length; i++) { var col = columns[r][i]; if (col.field) { ff.push([c, col.field]); } c += parseInt(col.colspan || "1"); } for (var i = 0; i < ff.length; i++) { ff[i][0] = getFixedColspan(ff[i][0]); } for (var i = 0; i < ff.length; i++) { var f = ff[i]; fields[f[0]] = f[1]; } }; for (var i = 0; i < columns.length; i++) { findColumnFields(i); } return fields; }; //加载本地数据,旧的行将被移除 function _removeData(jq, data) { var _ae = $.data(jq, "datagrid"); var _af = _ae.options; var dc = _ae.dc; data = _af.loadFilter.call(jq, data); data.total = parseInt(data.total); _ae.data = data; if (data.footer) { _ae.footer = data.footer; } if (!_af.remoteSort) { var opt = _getColumnOption(jq, _af.sortName); if (opt) { var _b0 = opt.sorter || function (a, b) { return (a > b ? 1 : -1); }; data.rows.sort(function (r1, r2) { return _b0(r1[_af.sortName], r2[_af.sortName]) * (_af.sortOrder == "asc" ? 1 : -1); }); } } if (_af.view.onBeforeRender) { _af.view.onBeforeRender.call(_af.view, jq, data.rows); } _af.view.render.call(_af.view, jq, dc.body2, false); _af.view.render.call(_af.view, jq, dc.body1, true); if (_af.showFooter) { _af.view.renderFooter.call(_af.view, jq, dc.footer2, false); _af.view.renderFooter.call(_af.view, jq, dc.footer1, true); } if (_af.view.onAfterRender) { _af.view.onAfterRender.call(_af.view, jq); } dc.view.children("style:gt(0)").remove(); _af.onLoadSuccess.call(jq, data); var _b1 = $(jq).datagrid("getPager"); if (_b1.length) { if (_b1.pagination("options").total != data.total) { _b1.pagination("refresh", { total: data.total }); } } _fixRowHeight(jq); dc.body2.triggerHandler("scroll"); _b2(); $(jq).datagrid("autoSizeColumn"); function _b2() { if (_af.idField) { for (var i = 0; i < data.rows.length; i++) { var row = data.rows[i]; if (_b3(_ae.selectedRows, row)) { _selectRow(jq, i, true); } if (_b3(_ae.checkedRows, row)) { _checkRow(jq, i, true); } } } function _b3(a, r) { for (var i = 0; i < a.length; i++) { if (a[i][_af.idField] == r[_af.idField]) { a[i] = r; return true; } } return false; }; }; }; //返回指定行的索引号,该行的参数可以是一行记录或一个ID字段值 function _getRowIndex(jq, row) { var opts = $.data(jq, "datagrid").options; var rows = $.data(jq, "datagrid").data.rows; if (typeof row == "object") { return getObjectIndex(rows, row); } else { for (var i = 0; i < rows.length; i++) { if (rows[i][opts.idField] == row) { return i; } } return -1; } }; //返回所有被选中的行,当没有记录被选中的时候将返回一个空数组 function _getSelected(jq) { var datagrid = $.data(jq, "datagrid"); var opts = datagrid.options; var data = datagrid.data; if (opts.idField) { return datagrid.selectedRows; } else { var selectRows = []; opts.finder.getTr(jq, "", "selected", 2).each(function () { var _be = parseInt($(this).attr("datagrid-row-index")); selectRows.push(data.rows[_be]); }); return selectRows; } }; //在复选框呗选中的时候返回所有行 function _getChecked(jq) { var datagrid = $.data(jq, "datagrid"); var opts = datagrid.options; if (opts.idField) { return datagrid.checkedRows; } else { var checkRows = []; datagrid.dc.view.find("div.datagrid-cell-check input:checked").each(function () { var _c4 = $(this).closest("tr.datagrid-row").attr("datagrid-row-index"); checkRows.push(opts.finder.getRow(jq, _c4)); }); return checkRows; } }; //通过ID值参数选择一行 function _selectRecord(jq, id) { var opts = $.data(jq, "datagrid").options; if (opts.idField) { var index = _getRowIndex(jq, id); if (index >= 0) { _selectRow(jq, index); } } }; //选择一行,行索引从0开始 function _selectRow(jq, index, _cd) { var datagrid = $.data(jq, "datagrid"); var dc = datagrid.dc; var opts = datagrid.options; var selectRows = datagrid.selectedRows; if (opts.singleSelect) { _clearSelections(jq); selectRows.splice(0, selectRows.length); } if (!_cd && opts.checkOnSelect) { _checkRow(jq, index, true); } var row = opts.finder.getRow(jq, index); if (opts.idField) { idFieldRows(selectRows, opts.idField, row); } opts.onSelect.call(jq, index, row); var tr = opts.finder.getTr(jq, index).addClass("datagrid-row-selected"); if (tr.length) { if (tr.closest("table").hasClass("datagrid-btable-frozen")) { return; } var _d3 = dc.view2.children("div.datagrid-header")._outerHeight(); var _d4 = dc.body2; var _d5 = _d4.outerHeight(true) - _d4.outerHeight(); var top = tr.position().top - _d3 - _d5; if (top < 0) { _d4.scrollTop(_d4.scrollTop() + top); } else { if (top + tr._outerHeight() > _d4.height() - 18) { _d4.scrollTop(_d4.scrollTop() + top + tr._outerHeight() - _d4.height() + 18); } } } }; function _unselectRow(_d7, _d8, _d9) { var _da = $.data(_d7, "datagrid"); var dc = _da.dc; var _db = _da.options; var _dc = $.data(_d7, "datagrid").selectedRows; if (!_d9 && _db.checkOnSelect) { _uncheckRow(_d7, _d8, true); } _db.finder.getTr(_d7, _d8).removeClass("datagrid-row-selected"); var row = _db.finder.getRow(_d7, _d8); if (_db.idField) { unSelectedRowsById(_dc, _db.idField, row[_db.idField]); } _db.onUnselect.call(_d7, _d8, row); }; function _selectAll(_df, _e0) { var _e1 = $.data(_df, "datagrid"); var _e2 = _e1.options; var _e3 = _e1.data.rows; var _e4 = $.data(_df, "datagrid").selectedRows; if (!_e0 && _e2.checkOnSelect) { _checkAll(_df, true); } _e2.finder.getTr(_df, "", "allbody").addClass("datagrid-row-selected"); if (_e2.idField) { for (var _e6 = 0; _e6 < _e3.length; _e6++) { idFieldRows(_e4, _e2.idField, _e3[_e6]); } } _e2.onSelectAll.call(_df, _e3); }; function _clearSelections(_e7, _e8) { var _e9 = $.data(_e7, "datagrid"); var _ea = _e9.options; var _eb = _e9.data.rows; var _ec = $.data(_e7, "datagrid").selectedRows; if (!_e8 && _ea.checkOnSelect) { _clearChecked(_e7, true); } _ea.finder.getTr(_e7, "", "selected").removeClass("datagrid-row-selected"); if (_ea.idField) { for (var _ee = 0; _ee < _eb.length; _ee++) { unSelectedRowsById(_ec, _ea.idField, _eb[_ee][_ea.idField]); } } _ea.onUnselectAll.call(_e7, _eb); }; //勾选一行 function _checkRow(jq, index, state) { var datagrid = $.data(jq, "datagrid"); var opts = datagrid.options; if (!state && opts.selectOnCheck) { _selectRow(jq, index, true); } var ck = opts.finder.getTr(jq, index).find("div.datagrid-cell-check input[type=checkbox]"); ck._propAttr("checked", true); ck = opts.finder.getTr(jq, "", "allbody").find("div.datagrid-cell-check input[type=checkbox]:not(:checked)"); if (!ck.length) { var dc = datagrid.dc; var _f4 = dc.header1.add(dc.header2); _f4.find("input[type=checkbox]")._propAttr("checked", true); } var row = opts.finder.getRow(jq, index); if (opts.idField) { idFieldRows(datagrid.checkedRows, opts.idField, row); } opts.onCheck.call(jq, index, row); }; //取消勾选一行 function _uncheckRow(jq, index, state) { var datagrid = $.data(jq, "datagrid"); var opts = datagrid.options; if (!state && opts.selectOnCheck) { _unselectRow(jq, index, true); } var ck = opts.finder.getTr(jq, index).find("div.datagrid-cell-check input[type=checkbox]"); ck._propAttr("checked", false); var dc = datagrid.dc; var _fa = dc.header1.add(dc.header2); _fa.find("input[type=checkbox]")._propAttr("checked", false); var row = opts.finder.getRow(jq, index); if (opts.idField) { unSelectedRowsById(datagrid.checkedRows, opts.idField, row[opts.idField]); } opts.onUncheck.call(jq, index, row); }; function _checkAll(_fb, _fc) { var _fd = $.data(_fb, "datagrid"); var _fe = _fd.options; var _ff = _fd.data.rows; if (!_fc && _fe.selectOnCheck) { _selectAll(_fb, true); } var dc = _fd.dc; var hck = dc.header1.add(dc.header2).find("input[type=checkbox]"); var bck = _fe.finder.getTr(_fb, "", "allbody").find("div.datagrid-cell-check input[type=checkbox]"); hck.add(bck)._propAttr("checked", true); if (_fe.idField) { for (var i = 0; i < _ff.length; i++) { idFieldRows(_fd.checkedRows, _fe.idField, _ff[i]); } } _fe.onCheckAll.call(_fb, _ff); }; function _clearChecked(_100, _101) { var _102 = $.data(_100, "datagrid"); var opts = _102.options; var rows = _102.data.rows; if (!_101 && opts.selectOnCheck) { _clearSelections(_100, true); } var dc = _102.dc; var hck = dc.header1.add(dc.header2).find("input[type=checkbox]"); var bck = opts.finder.getTr(_100, "", "allbody").find("div.datagrid-cell-check input[type=checkbox]"); hck.add(bck)._propAttr("checked", false); if (opts.idField) { for (var i = 0; i < rows.length; i++) { unSelectedRowsById(_102.checkedRows, opts.idField, rows[i][opts.idField]); } } opts.onUncheckAll.call(_100, rows); }; //开始编辑行 function _beginEdit(jq, index) { var opts = $.data(jq, "datagrid").options; var tr = opts.finder.getTr(jq, index); var row = opts.finder.getRow(jq, index); if (tr.hasClass("datagrid-row-editing")) { return; } if (opts.onBeforeEdit.call(jq, index, row) == false) { return; } tr.addClass("datagrid-row-editing"); createEditor(jq, index); fixEditorSize(jq); tr.find("div.datagrid-editable").each(function () { var _107 = $(this).parent().attr("field"); var ed = $.data(this, "datagrid.editor"); ed.actions.setValue(ed.target, row[_107]); }); validateRow(jq, index); }; //结束编辑行 function _endEdit(jq, index, revert) { var opts = $.data(jq, "datagrid").options; var updatedRows = $.data(jq, "datagrid").updatedRows; var insertedRows = $.data(jq, "datagrid").insertedRows; var tr = opts.finder.getTr(jq, index); var row = opts.finder.getRow(jq, index); if (!tr.hasClass("datagrid-row-editing")) { return; } if (!revert) { if (!validateRow(jq, index)) { return; } var changed = false; var newValues = {}; tr.find("div.datagrid-editable").each(function () { var field = $(this).parent().attr("field"); var ed = $.data(this, "datagrid.editor"); var field = ed.actions.getValue(ed.target); if (row[field] != field) { row[field] = field; changed = true; newValues[field] = field; } }); if (changed) { if (getObjectIndex(insertedRows, row) == -1) { if (getObjectIndex(updatedRows, row) == -1) { updatedRows.push(row); } } } } tr.removeClass("datagrid-row-editing"); destroyEditor(jq, index); $(jq).datagrid("refreshRow", index); if (!revert) { opts.onAfterEdit.call(jq, index, row, newValues); } else { opts.onCancelEdit.call(jq, index, row); } }; //获取指定行的编辑器。每个编辑器都有以下属性: //actions:编辑器可以执行的动作,同编辑器定义。 //target:目标编辑器的jQuery对象。 //field:字段名称。 //type:编辑器类型,比如:'text','combobox','datebox'等。 function _getEditors(jq, index) { var opts = $.data(jq, "datagrid").options; var tr = opts.finder.getTr(jq, index); var editors = []; tr.children("td").each(function () { var cell = $(this).find("div.datagrid-editable"); if (cell.length) { var ed = $.data(cell[0], "datagrid.editor"); editors.push(ed); } }); return editors; }; //获取指定编辑器,options包含2个属性: //index:行索引。 //field:字段名称。 function _getEditor(jq, options) { var editors = _getEditors(jq, options.index); for (var i = 0; i < editors.length; i++) { if (editors[i].field == options.field) { return editors[i]; } } return null; }; //创建编辑器 function createEditor(jq, index) { var opts = $.data(jq, "datagrid").options; var tr = opts.finder.getTr(jq, index); tr.children("td").each(function () { var cell = $(this).find("div.datagrid-cell"); var field = $(this).attr("field"); var col = _getColumnOption(jq, field); if (col && col.editor) { var type, editorOpts; if (typeof col.editor == "string") { type = col.editor; } else { type = col.editor.type; editorOpts = col.editor.options; } var editor = opts.editors[type]; if (editor) { var html = cell.html(); var width = cell._outerWidth(); cell.addClass("datagrid-editable"); cell._outerWidth(width); cell.html("<table border=\"0\" cellspacing=\"0\" cellpadding=\"1\"><tr><td></td></tr></table>"); cell.children("table").bind("click dblclick contextmenu", function (e) { e.stopPropagation(); }); $.data(cell[0], "datagrid.editor", { actions: editor, target: editor.init(cell.find("td"), editorOpts), field: field, type: type, oldHtml: html }); } } }); _fixRowHeight(jq, index, true); }; //销毁编辑器 function destroyEditor(jq, index) { var opts = $.data(jq, "datagrid").options; var tr = opts.finder.getTr(jq, index); tr.children("td").each(function () { var cell = $(this).find("div.datagrid-editable"); if (cell.length) { var ed = $.data(cell[0], "datagrid.editor"); if (ed.actions.destroy) { ed.actions.destroy(ed.target); } cell.html(ed.oldHtml); $.removeData(cell[0], "datagrid.editor"); cell.removeClass("datagrid-editable"); cell.css("width", ""); } }); }; //验证指定的行,当验证有效的时候返回true function validateRow(jq, index) { var tr = $.data(jq, "datagrid").options.finder.getTr(jq, index); if (!tr.hasClass("datagrid-row-editing")) { return true; } var vbox = tr.find(".validatebox-text"); vbox.validatebox("validate"); vbox.trigger("mouseleave"); var invalid = tr.find(".validatebox-invalid"); return invalid.length == 0; }; //从上一次的提交获取改变的所有行。类型参数指明用哪些类型改变的行,可以使用的值有:inserted,deleted,updated等。当类型参数未配置的时候返回所有改变的行 function _getChanges(jq, type) { var insertedRows = $.data(jq, "datagrid").insertedRows; var deletedRows = $.data(jq, "datagrid").deletedRows; var updatedRows = $.data(jq, "datagrid").updatedRows; if (!type) { var rows = []; rows = rows.concat(insertedRows); rows = rows.concat(deletedRows); rows = rows.concat(updatedRows); return rows; } else { if (type == "inserted") { return insertedRows; } else { if (type == "deleted") { return deletedRows; } else { if (type == "updated") { return updatedRows; } } } } return []; }; //删除行 function _deleteRow(jq, index) { var datagrid = $.data(jq, "datagrid"); var opts = datagrid.options; var data = datagrid.data; var insertedRows = datagrid.insertedRows; var deletedRows = datagrid.deletedRows; $(jq).datagrid("cancelEdit", index); var row = data.rows[index]; if (getObjectIndex(insertedRows, row) >= 0) { unSelectedRowsById(insertedRows, row); } else { deletedRows.push(row); } unSelectedRowsById(datagrid.selectedRows, opts.idField, data.rows[index][opts.idField]); unSelectedRowsById(datagrid.checkedRows, opts.idField, data.rows[index][opts.idField]); opts.view.deleteRow.call(opts.view, jq, index); if (opts.height == "auto") { _fixRowHeight(jq); } $(jq).datagrid("getPager").pagination("refresh", { total: data.total }); }; //插入一个新行,参数包括一下属性: //index:要插入的行索引,如果该索引值未定义,则追加新行。 //row:行数据 function _insertRow(jq, param) { var data = $.data(jq, "datagrid").data; var view = $.data(jq, "datagrid").options.view; var insertedRows = $.data(jq, "datagrid").insertedRows; view.insertRow.call(view, jq, param.index, param.row); insertedRows.push(param.row); $(jq).datagrid("getPager").pagination("refresh", { total: data.total }); }; //追加一个新行。新行将被添加到最后的位置 function _appendRow(jq, row) { var data = $.data(jq, "datagrid").data; var view = $.data(jq, "datagrid").options.view; var insertedRows = $.data(jq, "datagrid").insertedRows; view.insertRow.call(view, jq, null, row); insertedRows.push(row); $(jq).datagrid("getPager").pagination("refresh", { total: data.total }); }; //加载本地数据,旧的行将被移除 function _loadData(jq) { var datagrid = $.data(jq, "datagrid"); var data = datagrid.data; var rows = data.rows; var originalRows = []; for (var i = 0; i < rows.length; i++) { originalRows.push($.extend({}, rows[i])); } datagrid.originalRows = originalRows; datagrid.updatedRows = []; datagrid.insertedRows = []; datagrid.deletedRows = []; }; //提交所有从加载或者上一次调用acceptChanges函数后更改的数据 function _acceptChanges(jq) { var data = $.data(jq, "datagrid").data; var ok = true; for (var i = 0, len = data.rows.length; i < len; i++) { if (validateRow(jq, i)) { _endEdit(jq, i, false); } else { ok = false; } } if (ok) { _loadData(jq); } }; //回滚所有从创建或者上一次调用acceptChanges函数后更改的数据 function _rejectChanges(jq) { var datagrid = $.data(jq, "datagrid"); var opts = datagrid.options; var originalRows = datagrid.originalRows; var insertedRows = datagrid.insertedRows; var deletedRows = datagrid.deletedRows; var selectedRows = datagrid.selectedRows; var checkedRows = datagrid.checkedRows; var data = datagrid.data; function Rowids(a) { var ids = []; for (var i = 0; i < a.length; i++) { ids.push(a[i][opts.idField]); } return ids; }; function selectRecord(ids, type) { for (var i = 0; i < ids.length; i++) { var index = _getRowIndex(jq, ids[i]); (type == "s" ? _selectRow : _checkRow)(jq, index, true); } }; for (var i = 0; i < data.rows.length; i++) { _endEdit(jq, i, true); } var sids = Rowids(selectedRows); var cids = Rowids(checkedRows); selectedRows.splice(0, selectedRows.length); checkedRows.splice(0, checkedRows.length); data.total += deletedRows.length - insertedRows.length; data.rows = originalRows; _removeData(jq, data); selectRecord(sids, "s"); selectRecord(cids, "c"); _loadData(jq); }; //加载和显示第一页的所有行。如果指定了'param',它将取代'queryParams'属性。通常可以通过传递一些参数执行一次查询,通过调用这个方法从服务器加载新数据 function _load(jq, param) { var opts = $.data(jq, "datagrid").options; if (param) { opts.queryParams = param; } var param = $.extend({}, opts.queryParams); if (opts.pagination) { $.extend(param, { page: opts.pageNumber, rows: opts.pageSize }); } if (opts.sortName) { $.extend(param, { sort: opts.sortName, order: opts.sortOrder }); } if (opts.onBeforeLoad.call(jq, param) == false) { return; } $(jq).datagrid("loading"); setTimeout(function () { doRequest(); }, 0); function doRequest() { var loaded = opts.loader.call(jq, param, function (data) { setTimeout(function () { $(jq).datagrid("loaded"); }, 0); _removeData(jq, data); setTimeout(function () { _loadData(jq); }, 0); }, function () { setTimeout(function () { $(jq).datagrid("loaded"); }, 0); opts.onLoadError.apply(jq, arguments); }); if (loaded == false) { $(jq).datagrid("loaded"); } }; }; //合并单元格,options包含以下属性: //index:行索引。 //field:字段名称。 //rowspan:合并的行数。 //colspan:合并的列数。 function _mergeCells(jq, options) { var opts = $.data(jq, "datagrid").options; options.rowspan = options.rowspan || 1; options.colspan = options.colspan || 1; if (options.rowspan == 1 && options.colspan == 1) { return; } var tr = opts.finder.getTr(jq, (options.index != undefined ? options.index : options.id)); if (!tr.length) { return; } var row = opts.finder.getRow(jq, tr); var field = row[options.field]; var td = tr.find("td[field=\"" + options.field + "\"]"); td.attr("rowspan", options.rowspan).attr("colspan", options.colspan); td.addClass("datagrid-td-merged"); for (var i = 1; i < options.colspan; i++) { td = td.next(); td.hide(); row[td.attr("field")] = field; } for (var i = 1; i < options.rowspan; i++) { tr = tr.next(); if (!tr.length) { break; } var row = opts.finder.getRow(jq, tr); var td = tr.find("td[field=\"" + options.field + "\"]").hide(); row[td.attr("field")] = field; for (var j = 1; j < options.colspan; j++) { td = td.next(); td.hide(); row[td.attr("field")] = field; } } _91(jq); }; //实例化 $.fn.datagrid = function (options, param) { if (typeof options == "string") { return $.fn.datagrid.methods[options](this, param); } options = options || {}; return this.each(function () { var state = $.data(this, "datagrid"); var opts; if (state) { opts = $.extend(state.options, options); state.options = opts; } else { opts = $.extend({}, $.extend({}, $.fn.datagrid.defaults, { queryParams: {} }), $.fn.datagrid.parseOptions(this), options); $(this).css("width", "").css("height", ""); var gridWrap = wrapGrid(this, opts.rownumbers); if (!opts.columns) { opts.columns = gridWrap.columns; } if (!opts.frozenColumns) { opts.frozenColumns = gridWrap.frozenColumns; } opts.columns = $.extend(true, [], opts.columns); opts.frozenColumns = $.extend(true, [], opts.frozenColumns); opts.view = $.extend({}, opts.view); $.data(this, "datagrid", { options: opts, panel: gridWrap.panel, dc: gridWrap.dc, selectedRows: [], checkedRows: [], data: { total: 0, rows: [] }, originalRows: [], updatedRows: [], insertedRows: [], deletedRows: [] }); } init(this); if (opts.data) { _removeData(this, opts.data); _loadData(this); } else { var data = getGridData(this); if (data.total > 0) { _removeData(this, data); _loadData(this); } } _resize(this); _load(this); bingEvent(this); }); }; //editors 重写默认值对象 var editors = { //文本框 text: { //初始化编辑器并返回目标对象 init: function (container, options) { var editor = $("<input type=\"text\" class=\"datagrid-editable-input\">").appendTo(container); return editor; }, //从编辑器中获取值 getValue: function () { return $(target).val(); }, //向编辑器中写入值 setValue: function (target, value) { $(target).val(value); }, //向编辑器中写入值 resize: function (target, width) { $(target)._outerWidth(width); } }, //多行文本 textarea: { //初始化编辑器并返回目标对象 init: function (container, options) { var editor = $("<textarea class=\"datagrid-editable-input\"></textarea>").appendTo(container); return editor; }, getValue: function (target) { return $(target).val(); }, setValue: function (target, value) { $(target).val(value); }, resize: function (target, width) { $(target)._outerWidth(width); } }, //选择框 checkbox: { //初始化编辑器并返回目标对象 init: function (container, options) { var editor = $("<input type=\"checkbox\">").appendTo(container); editor.val(options.on); editor.attr("offval", options.off); return editor; }, getValue: function (target) { if ($(target).is(":checked")) { return $(target).val(); } else { return $(target).attr("offval"); } }, setValue: function (target, value) { var checked = false; if ($(target).val() == value) { checked = true; } $(target)._propAttr("checked", checked); } }, //数值输入框 numberbox: { //初始化编辑器并返回目标对象 init: function (container, options) { var editor = $("<input type=\"text\" class=\"datagrid-editable-input\">").appendTo(container); editor.numberbox(options); return editor; }, destroy: function (target) { $(target).numberbox("destroy"); }, getValue: function (target) { $(target).blur(); return $(target).numberbox("getValue"); }, setValue: function (target, value) { $(target).numberbox("setValue", value); }, resize: function (target, width) { $(target)._outerWidth(width); } }, //验证框 validatebox: { //初始化编辑器并返回目标对象 init: function (container, options) { var editor = $("<input type=\"text\" class=\"datagrid-editable-input\">").appendTo(container); editor.validatebox(options); return editor; }, destroy: function (target) { $(target).validatebox("destroy"); }, getValue: function (target) { return $(target).val(); }, setValue: function (target, value) { $(target).val(value); }, resize: function (target, width) { $(target)._outerWidth(width); } }, //日期框 datebox: { //初始化编辑器并返回目标对象 init: function (container, options) { var editor = $("<input type=\"text\">").appendTo(container); editor.datebox(options); return editor; }, destroy: function (target) { $(target).datebox("destroy"); }, getValue: function (target) { return $(target).datebox("getValue"); }, setValue: function (target, value) { $(target).datebox("setValue", value); }, resize: function (target, width) { $(target).datebox("resize", width); } }, //下拉框 combobox: { //初始化编辑器并返回目标对象 init: function (container, options) { var editor = $("<input type=\"text\">").appendTo(container); editor.combobox(options || {}); return editor; }, destroy: function (target) { $(target).combobox("destroy"); }, getValue: function (target) { return $(target).combobox("getValue"); }, setValue: function (target, value) { $(target).combobox("setValue", value); }, resize: function (target, width) { $(target).combobox("resize", width); } }, //下拉树 combotree: { //初始化编辑器并返回目标对象 init: function (container, target) { var editor = $("<input type=\"text\">").appendTo(container); editor.combotree(target); return editor; }, destroy: function (target) { $(target).combotree("destroy"); }, getValue: function (target) { return $(target).combotree("getValue"); }, setValue: function (target, value) { $(target).combotree("setValue", value); }, resize: function (target, width) { $(target).combotree("resize", width); } } }; //表格默认方法 $.fn.datagrid.methods = { //返回属性对象 options: function (jq) { var opts = $.data(jq[0], "datagrid").options; var panelOpts = $.data(jq[0], "datagrid").panel.panel("options"); var opts = $.extend(opts, { width: panelOpts.width, height: panelOpts.height, closed: panelOpts.closed, collapsed: panelOpts.collapsed, minimized: panelOpts.minimized, maximized: panelOpts.maximized }); return opts; }, //返回面板对象 getPanel: function (jq) { return $.data(jq[0], "datagrid").panel; }, //返回页面对象 getPager: function (jq) { return $.data(jq[0], "datagrid").panel.children("div.datagrid-pager"); }, //返回列字段。如果设置了frozen属性为true,将返回固定列的字段名 getColumnFields: function (jq, frozen) { return _getColumnFields(jq[0], frozen); }, //返回指定列属性 getColumnOption: function (jq, field) { return _getColumnOption(jq[0], field); }, //做调整和布局 resize: function (jq, param) { return jq.each(function () { _resize(this, param); }); }, //加载和显示第一页的所有行。如果指定了'param',它将取代'queryParams'属性。通常可以通过传递一些参数执行一次查询,通过调用这个方法从服务器加载新数据 load: function (jq, param) { return jq.each(function () { var opts = $(this).datagrid("options"); opts.pageNumber = 1; var Pager = $(this).datagrid("getPager"); Pager.pagination({ pageNumber: 1 }); _load(this, param); }); }, //重载行。等同于'load'方法,但是它将保持在当前页 reload: function (jq, param) { return jq.each(function () { _load(this, param); }); }, //重载页脚行。代码示例 reloadFooter: function (jq, footer) { return jq.each(function () { var opts = $.data(this, "datagrid").options; var dc = $.data(this, "datagrid").dc; if (footer) { $.data(this, "datagrid").footer = footer; } if (opts.showFooter) { opts.view.renderFooter.call(opts.view, this, dc.footer2, false); opts.view.renderFooter.call(opts.view, this, dc.footer1, true); if (opts.view.onAfterRender) { opts.view.onAfterRender.call(opts.view, this); } $(this).datagrid("fixRowHeight"); } }); }, //显示载入状态 loading: function (jq) { return jq.each(function () { var opts = $.data(this, "datagrid").options; $(this).datagrid("getPager").pagination("loading"); if (opts.loadMsg) { var Panel = $(this).datagrid("getPanel"); $("<div class=\"datagrid-mask\" style=\"display:block\"></div>").appendTo(Panel); var msg = $("<div class=\"datagrid-mask-msg\" style=\"display:block;left:50%\"></div>").html(opts.loadMsg).appendTo(Panel); msg.css("marginLeft", -msg.outerWidth() / 2); } }); }, //隐藏载入状态 loaded: function (jq) { return jq.each(function () { $(this).datagrid("getPager").pagination("loaded"); var Panel = $(this).datagrid("getPanel"); Panel.children("div.datagrid-mask-msg").remove(); Panel.children("div.datagrid-mask").remove(); }); }, //使列自动展开/收缩到合适的数据表格宽度 fitColumns: function (jq) { return jq.each(function () { _fitColumns(this); }); }, //固定列大小。如果'field'参数未配置,所有列大小将都是固定的 fixColumnSize: function (jq, field) { return jq.each(function () { _fixColumnSize(this, field); }); }, //固定指定列高度。如果'index'参数未配置,所有行高度都是固定的 fixRowHeight: function (jq, index) { return jq.each(function () { _fixRowHeight(this, index); }); }, //冻结指定行,当数据表格表格向下滚动的时候始终保持被冻结的行显示在顶部 freezeRow: function (jq, index) { return jq.each(function () { _freezeRow(this, index); }); }, //自动调整列宽度以适应内容 autoSizeColumn: function (jq, field) { return jq.each(function () { _autoSizeColumn(this, field); }); }, //加载本地数据,旧的行将被移除 loadData: function (jq, data) { return jq.each(function () { _removeData(this, data); _loadData(this); }); }, //返回加载完毕后的数据 getData: function (jq) { return $.data(jq[0], "datagrid").data; }, //返回当前页的所有行 getRows: function (jq) { return $.data(jq[0], "datagrid").data.rows; }, //返回页脚行 getFooterRows: function (jq) { return $.data(jq[0], "datagrid").footer; }, //返回指定行的索引号,该行的参数可以是一行记录或一个ID字段值 getRowIndex: function (jq, id) { return _getRowIndex(jq[0], id); }, //在复选框呗选中的时候返回所有行 getChecked: function (jq) { return _getChecked(jq[0]); }, //返回第一个被选中的行或如果没有选中的行则返回null getSelected: function (jq) { var rows = _getSelected(jq[0]); return rows.length > 0 ? rows[0] : null; }, //返回所有被选中的行,当没有记录被选中的时候将返回一个空数组 getSelections: function (jq) { return _getSelected(jq[0]); }, //清除所有选择的行 clearSelections: function (jq) { return jq.each(function () { var selectedRows = $.data(this, "datagrid").selectedRows; selectedRows.splice(0, selectedRows.length); _clearSelections(this); }); }, //清楚所有勾选的行 clearChecked: function (jq) { return jq.each(function () { var checkedRows = $.data(this, "datagrid").checkedRows; checkedRows.splice(0, checkedRows.length); _clearChecked(this); }); }, //clearChecked selectAll: function (jq) { return jq.each(function () { _selectAll(this); }); }, //取消选择所有当前页中所有的行 unselectAll: function (jq) { return jq.each(function () { _clearSelections(this); }); }, //选择一行,行索引从0开始 selectRow: function (jq, index) { return jq.each(function () { _selectRow(this, index); }); }, //通过ID值参数选择一行 selectRecord: function (jq, id) { return jq.each(function () { _selectRecord(this, id); }); }, //取消选择一行 unselectRow: function (jq, index) { return jq.each(function () { _unselectRow(this, index); }); }, //勾选一行,行索引从0开始 checkRow: function (jq, index) { return jq.each(function () { _checkRow(this, index); }); }, uncheckRow: function (jq, _1b7) { return jq.each(function () { _uncheckRow(this, _1b7); }); }, //勾选当前页中的所有行 checkAll: function (jq) { return jq.each(function () { _checkAll(this); }); }, //取消勾选当前页中的所有行 uncheckAll: function (jq) { return jq.each(function () { _clearChecked(this); }); }, //开始编辑行 beginEdit: function (jq, index) { return jq.each(function () { _beginEdit(this, index); }); }, //结束编辑行 endEdit: function (jq, index) { return jq.each(function () { _endEdit(this, index, false); }); }, //取消编辑行 cancelEdit: function (jq, index) { return jq.each(function () { _endEdit(this, index, true); }); }, //获取指定行的编辑器。每个编辑器都有以下属性: //actions:编辑器可以执行的动作,同编辑器定义。 //target:目标编辑器的jQuery对象。 //field:字段名称。 //type:编辑器类型,比如:'text','combobox','datebox'等。 getEditors: function (jq, index) { return _getEditors(jq[0], index); }, //获取指定编辑器,options包含2个属性: //index:行索引。 //field:字段名称。 getEditor: function (jq, options) { return _getEditor(jq[0], options); }, //刷新行。 refreshRow: function (jq, index) { return jq.each(function () { var opts = $.data(this, "datagrid").options; opts.view.refreshRow.call(opts.view, this, index); }); }, //验证指定的行,当验证有效的时候返回true validateRow: function (jq, index) { return validateRow(jq[0], index); }, //更新指定行,参数包含下列属性: //index:执行更新操作的行索引。 //row:更新行的新数据 updateRow: function (jq, param) { return jq.each(function () { var opts = $.data(this, "datagrid").options; opts.view.updateRow.call(opts.view, this, param.index, param.row); }); }, //追加一个新行。新行将被添加到最后的位置 appendRow: function (jq, row) { return jq.each(function () { _appendRow(this, row); }); }, //插入一个新行,参数包括一下属性: //index:要插入的行索引,如果该索引值未定义,则追加新行。 //row:行数据 insertRow: function (jq, param) { return jq.each(function () { _insertRow(this, param); }); }, //删除行 deleteRow: function (jq, index) { return jq.each(function () { _deleteRow(this, index); }); }, //从上一次的提交获取改变的所有行。类型参数指明用哪些类型改变的行,可以使用的值有:inserted,deleted,updated等。当类型参数未配置的时候返回所有改变的行 getChanges: function (jq, type) { return _getChanges(jq[0], type); }, //提交所有从加载或者上一次调用acceptChanges函数后更改的数据 acceptChanges: function (jq) { return jq.each(function () { _acceptChanges(this); }); }, //回滚所有从创建或者上一次调用acceptChanges函数后更改的数据 rejectChanges: function (jq) { return jq.each(function () { _rejectChanges(this); }); }, //合并单元格,options包含以下属性: //index:行索引。 //field:字段名称。 //rowspan:合并的行数。 //colspan:合并的列数。 mergeCells: function (jq, options) { return jq.each(function () { _mergeCells(this, options); }); }, //显示指定的列 showColumn: function (jq, field) { return jq.each(function () { var Panel = $(this).datagrid("getPanel"); Panel.find("td[field=\"" + field + "\"]").show(); $(this).datagrid("getColumnOption", field).hidden = false; $(this).datagrid("fitColumns"); }); }, //隐藏指定的列 hideColumn: function (jq, field) { return jq.each(function () { var Panel = $(this).datagrid("getPanel"); Panel.find("td[field=\"" + field + "\"]").hide(); $(this).datagrid("getColumnOption", field).hidden = true; $(this).datagrid("fitColumns"); }); } }; $.fn.datagrid.parseOptions = function (_1c8) { var t = $(_1c8); return $.extend({}, $.fn.panel.parseOptions(_1c8), $.parser.parseOptions(_1c8, ["url", "toolbar", "idField", "sortName", "sortOrder", "pagePosition", "resizeHandle", { fitColumns: "boolean", autoRowHeight: "boolean", striped: "boolean", nowrap: "boolean" }, { rownumbers: "boolean", singleSelect: "boolean", checkOnSelect: "boolean", selectOnCheck: "boolean" }, { pagination: "boolean", pageSize: "number", pageNumber: "number" }, { remoteSort: "boolean", showHeader: "boolean", showFooter: "boolean" }, { scrollbarSize: "number" }]), { pageList: (t.attr("pageList") ? eval(t.attr("pageList")) : undefined), loadMsg: (t.attr("loadMsg") != undefined ? t.attr("loadMsg") : undefined), rowStyler: (t.attr("rowStyler") ? eval(t.attr("rowStyler")) : undefined) }); }; //定义数据表格的视图 该视图是一个对象,将告诉数据表格如何渲染行。该对象必须定义下列函 var view = { // 数据加载时调用。 //target:DOM对象,数据表格对象。 //container:行容器。 //frozen:指明如何渲染冻结容器。 render: function (target, container, frozen) { var datagrid = $.data(target, "datagrid"); var opts = datagrid.options; var rows = datagrid.data.rows; var fields = $(target).datagrid("getColumnFields", frozen); if (frozen) { if (!(opts.rownumbers || (opts.frozenColumns && opts.frozenColumns.length))) { return; } } var html = ["<table class=\"datagrid-btable\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\"><tbody>"]; for (var i = 0; i < rows.length; i++) { var cls = (i % 2 && opts.striped) ? "class=\"datagrid-row datagrid-row-alt\"" : "class=\"datagrid-row\""; var style = opts.rowStyler ? opts.rowStyler.call(target, i, rows[i]) : ""; var style = style ? "style=\"" + style + "\"" : ""; var _1d2 = datagrid.rowIdPrefix + "-" + (frozen ? 1 : 2) + "-" + i; html.push("<tr id=\"" + _1d2 + "\" datagrid-row-index=\"" + i + "\" " + cls + " " + style + ">"); html.push(this.renderRow.call(this, target, fields, frozen, i, rows[i])); html.push("</tr>"); } html.push("</tbody></table>"); $(container).html(html.join("")); }, //这是一个选择函数来渲染行页脚 renderFooter: function (target, container, frozen) { var opts = $.data(target, "datagrid").options; var rows = $.data(target, "datagrid").footer || []; var fields = $(target).datagrid("getColumnFields", frozen); var html = ["<table class=\"datagrid-ftable\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\"><tbody>"]; for (var i = 0; i < rows.length; i++) { html.push("<tr class=\"datagrid-row\" datagrid-row-index=\"" + i + "\">"); html.push(this.renderRow.call(this, target, fields, frozen, i, rows[i])); html.push("</tr>"); } html.push("</tbody></table>"); $(container).html(html.join("")); }, //这是一个属性功能,将调用render函数 renderRow: function (target, fields, frozen, rowIndex, rowData) { var opts = $.data(target, "datagrid").options; var cc = []; if (frozen && opts.rownumbers) { var rowIndex = rowIndex + 1; if (opts.pagination) { rowIndex += (opts.pageNumber - 1) * opts.pageSize; } cc.push("<td class=\"datagrid-td-rownumber\"><div class=\"datagrid-cell-rownumber\">" + rowIndex + "</div></td>"); } for (var i = 0; i < fields.length; i++) { var field = fields[i]; var col = $(target).datagrid("getColumnOption", field); if (col) { var _1df = rowData[field]; var style = col.styler ? (col.styler(_1df, rowData, rowIndex) || "") : ""; var style = col.hidden ? "style=\"display:none;" + style + "\"" : (style ? "style=\"" + style + "\"" : ""); cc.push("<td field=\"" + field + "\" " + style + ">"); if (col.checkbox) { var style = ""; } else { var style = ""; 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=\"" + (_1df != undefined ? _1df : "") + "\"/>"); } else { if (col.formatter) { cc.push(col.formatter(_1df, rowData, rowIndex)); } else { cc.push(_1df); } } cc.push("</div>"); cc.push("</td>"); } } return cc.join(""); }, //定义如何刷新指定的行 refreshRow: function (target, rowIndex) { this.updateRow.call(this, target, rowIndex, {}); }, //更新行 updateRow: function (target, rowIndex, row) { var opts = $.data(target, "datagrid").options; var rows = $(target).datagrid("getRows"); $.extend(rows[rowIndex], row); var style = opts.rowStyler ? opts.rowStyler.call(target, rowIndex, rows[rowIndex]) : ""; function _1e7(_1e8) { var _1e9 = $(target).datagrid("getColumnFields", _1e8); var tr = opts.finder.getTr(target, rowIndex, "body", (_1e8 ? 1 : 2)); var _1ea = tr.find("div.datagrid-cell-check input[type=checkbox]").is(":checked"); tr.html(this.renderRow.call(this, target, _1e9, _1e8, rowIndex, rows[rowIndex])); tr.attr("style", style || ""); if (_1ea) { tr.find("div.datagrid-cell-check input[type=checkbox]")._propAttr("checked", true); } }; _1e7.call(this, true); _1e7.call(this, false); $(target).datagrid("fixRowHeight", rowIndex); }, //插入行 insertRow: function (target, rowIndex, row) { var datagrid = $.data(target, "datagrid"); var opts = datagrid.options; var dc = datagrid.dc; var data = datagrid.data; if (rowIndex == undefined || rowIndex == null) { rowIndex = data.rows.length; } if (rowIndex > data.rows.length) { rowIndex = data.rows.length; } function _1ee(_1ef) { var _1f0 = _1ef ? 1 : 2; for (var i = data.rows.length - 1; i >= rowIndex; i--) { var tr = opts.finder.getTr(target, i, "body", _1f0); tr.attr("datagrid-row-index", i + 1); tr.attr("id", datagrid.rowIdPrefix + "-" + _1f0 + "-" + (i + 1)); if (_1ef && opts.rownumbers) { var _1f1 = i + 2; if (opts.pagination) { _1f1 += (opts.pageNumber - 1) * opts.pageSize; } tr.find("div.datagrid-cell-rownumber").html(_1f1); } } }; function _1f2(_1f3) { var _1f4 = _1f3 ? 1 : 2; var _1f5 = $(target).datagrid("getColumnFields", _1f3); var _1f6 = datagrid.rowIdPrefix + "-" + _1f4 + "-" + rowIndex; var tr = "<tr id=\"" + _1f6 + "\" class=\"datagrid-row\" datagrid-row-index=\"" + rowIndex + "\"></tr>"; if (rowIndex >= data.rows.length) { if (data.rows.length) { opts.finder.getTr(target, "", "last", _1f4).after(tr); } else { var cc = _1f3 ? dc.body1 : dc.body2; cc.html("<table cellspacing=\"0\" cellpadding=\"0\" border=\"0\"><tbody>" + tr + "</tbody></table>"); } } else { opts.finder.getTr(target, rowIndex + 1, "body", _1f4).before(tr); } }; _1ee.call(this, true); _1ee.call(this, false); _1f2.call(this, true); _1f2.call(this, false); data.total += 1; data.rows.splice(rowIndex, 0, row); this.refreshRow.call(this, target, rowIndex); }, //删除行 deleteRow: function (target, rowIndex) { var datagrid = $.data(target, "datagrid"); var opts = datagrid.options; var data = datagrid.data; function _1fa(_1fb) { var _1fc = _1fb ? 1 : 2; for (var i = rowIndex + 1; i < data.rows.length; i++) { var tr = opts.finder.getTr(target, i, "body", _1fc); tr.attr("datagrid-row-index", i - 1); tr.attr("id", datagrid.rowIdPrefix + "-" + _1fc + "-" + (i - 1)); if (_1fb && opts.rownumbers) { var _1fd = i; if (opts.pagination) { _1fd += (opts.pageNumber - 1) * opts.pageSize; } tr.find("div.datagrid-cell-rownumber").html(_1fd); } } }; opts.finder.getTr(target, rowIndex).remove(); _1fa.call(this, true); _1fa.call(this, false); data.total -= 1; data.rows.splice(rowIndex, 1); }, //在视图被呈现之前触发 onBeforeRender: function (target, rows) { }, //在视图呗呈现之后触发 onAfterRender: function (target) { var opts = $.data(target, "datagrid").options; if (opts.showFooter) { var footer = $(target).datagrid("getPanel").find("div.datagrid-footer"); footer.find("div.datagrid-cell-rownumber,div.datagrid-cell-check").css("visibility", "hidden"); } } }; //表格默认属性 以及事件(集成panel的属性和事件) $.fn.datagrid.defaults = $.extend({}, $.fn.panel.defaults, { frozenColumns: undefined,//同列属性,但是这些列将会被冻结在左侧 columns: undefined,//数据表格列配置对象,详见列属性说明中更多的细节 fitColumns: false,//真正的自动展开/收缩列的大小,以适应网格的宽度,防止水平滚动 resizeHandle: "right",//调整列的位置,可用的值有:'left','right','both'。在使用'right'的时候用户可以通过拖动右侧边缘的列标题调整列 autoRowHeight: true,//定义设置行的高度,根据该行的内容。设置为false可以提高负载性能 toolbar: null,//顶部工具栏的数据表格面板。可能的值:1) 一个数组,每个工具属性都和linkbutton一样。 2) 选择器指定的工具栏 striped: false,//是否显示斑马线效果 method: "post",//该方法类型请求远程数据 nowrap: true,//如果为true,则在同一行中显示数据。设置为true可以提高加载性能 idField: null,//指明哪一个字段是标识字段 url: null,//指明哪一个字段是标识字段 data: null,//数据加载 loadMsg: "Processing, please wait ...",//在从远程站点加载数据的时候显示提示消息 rownumbers: false,//如果为true,则显示一个行号列 singleSelect: false,//如果为true,则只允许选择一行 selectOnCheck: true,//如果为true,单击复选框将永远选择行。 如果为false,选择行将不选中复选框 checkOnSelect: true,//如果为true,当用户点击行的时候该复选框就会被选中或取消选中。 如果为false,当用户仅在点击该复选框的时候才会呗选中或取消 pagination: false,//如果为true,则在数据表格控件底部显示分页工具栏 pagePosition: "bottom",//定义分页工具栏的位置。可用的值有:'top','bottom','both'。 pageNumber: 1,//在设置分页属性的时候初始化页码 pageSize: 10,//在设置分页属性的时候初始化页面大小 pageList: [10, 20, 30, 40, 50],//在设置分页属性的时候初始化页面大小 queryParams: {},//在请求远程数据的时候发送额外的参数 sortName: null,//定义哪些列可以进行排序 sortOrder: "asc",//定义列的排序顺序,只能是'asc'或'desc' remoteSort: true,//定义从服务器对数据进行排序 showHeader: true,//定义是否显示行头 showFooter: false,//定义是否显示行脚 scrollbarSize: 18,//滚动条的宽度(当滚动条是垂直的时候)或高度(当滚动条是水平的时候)。 //返回样式如'background:red'。带2个参数的函数: rowIndex:该行索引从0开始 rowData:与此相对应的记录行 rowStyler: function (rowIndex, rowData) { }, //定义如何从远程服务器加载数据。返回false可以放弃本次请求动作。该函数接受以下参数: //param:参数对象传递给远程服务器。 //success(data):当检索数据成功的时候会调用该回调函数。 //error():当检索数据失败的时候会调用该回调函数 loader: function (param, success, error) { var opts = $(this).datagrid("options"); if (!opts.url) { return false; } $.ajax({ type: opts.method, url: opts.url, data: param, dataType: "json", success: function (data) { success(data); }, error: function () { error.apply(this, arguments); } }); }, //返回过滤数据显示。该函数带一个参数'data'用来指向源数据(即:获取的数据源,比如Json对象)。您可以改变源数据的标准数据格式。这个函数必须返回包含'total'和'rows'属性的标准数据对象 loadFilter: function (data) { if (typeof data.length == "number" && typeof data.splice == "function") { return { total: data.length, rows: data }; } else { return data; } }, //定义在编辑行的时候使用的编辑器 editors: editors, finder: { getTr: function (target, rowIndex, type, step) { type = type || "body"; step = step || 0; var _209 = $.data(target, "datagrid"); var dc = _209.dc; var opts = _209.options; if (step == 0) { var tr1 = opts.finder.getTr(target, rowIndex, type, 1); var tr2 = opts.finder.getTr(target, rowIndex, type, 2); return tr1.add(tr2); } else { if (type == "body") { var tr = $("#" + _209.rowIdPrefix + "-" + step + "-" + rowIndex); if (!tr.length) { tr = (step == 1 ? dc.body1 : dc.body2).find(">table>tbody>tr[datagrid-row-index=" + rowIndex + "]"); } return tr; } else { if (type == "footer") { return (step == 1 ? dc.footer1 : dc.footer2).find(">table>tbody>tr[datagrid-row-index=" + rowIndex + "]"); } else { if (type == "selected") { return (step == 1 ? dc.body1 : dc.body2).find(">table>tbody>tr.datagrid-row-selected"); } else { if (type == "last") { return (step == 1 ? dc.body1 : dc.body2).find(">table>tbody>tr[datagrid-row-index]:last"); } else { if (type == "allbody") { return (step == 1 ? dc.body1 : dc.body2).find(">table>tbody>tr[datagrid-row-index]"); } else { if (type == "allfooter") { return (step == 1 ? dc.footer1 : dc.footer2).find(">table>tbody>tr[datagrid-row-index]"); } } } } } } } }, getRow: function (_20a, p) { var _20b = (typeof p == "object") ? p.attr("datagrid-row-index") : p; return $.data(_20a, "datagrid").data.rows[parseInt(_20b)]; } }, //定义数据表格的视图 view: view, //在载入请求数据数据之前触发,如果返回false可终止载入数据操作 onBeforeLoad: function (param) { }, //在数据加载成功的时候触发 onLoadSuccess: function () { }, //在数据加载成功的时候触发 onLoadError: function () { }, //在用户点击一行的时候触发,参数包括: //rowIndex:点击的行的索引值,该索引值从0开始。 //rowData:对应于点击行的记录 onClickRow: function (rowIndex, rowData) { }, //在用户双击一行的时候触发,参数包括: //rowIndex:点击的行的索引值,该索引值从0开始。 //rowData:对应于点击行的记录 onDblClickRow: function (rowIndex, onDblClickRow) { }, //在用户点击一个单元格的时候触发 onClickCell: function (rowIndex, field, value) { }, //在用户双击一个单元格的时候触发 onDblClickCell: function (rowIndex, field, value) { }, //在用户排序一列的时候触发,参数包括: //sort:排序列字段名称。 //order:排序列的顺序(ASC或DESC) onSortColumn: function (sort, order) { }, //在用户调整列大小的时候触发 onResizeColumn: function (field, width) { }, //在用户选择一行的时候触发,参数包括: //rowIndex:选择的行的索引值,索引从0开始。 //rowData:对应于所选行的记录 onSelect: function (rowIndex, rowData) { }, // 在用户选择一行的时候触发,参数包括: //rowIndex:选择的行的索引值,索引从0开始。 //rowData:对应于所选行的记录 onUnselect: function (rowIndex, rowData) { }, //在用户选择所有行的时候触发 onSelectAll: function (rows) { }, //在用户取消选择所有行的时候触发 onUnselectAll: function (rows) { }, // 在用户勾选一行的时候触发,参数包括: //rowIndex:选中的行索引,索引从0开始。 //rowData:对应于所选行的记录 onCheck: function (rowIndex, rowData) { }, // 在用户取消勾选一行的时候触发,参数包括: //rowIndex:选中的行索引,索引从0开始。 //rowData:对应于取消勾选行的记录 onUncheck: function (rowIndex, rowData) { }, //在用户勾选所有行的时候触发 onCheckAll: function (rows) { }, //在用户取消勾选所有行的时候触发 onUncheckAll: function (rows) { }, // 在用户开始编辑一行的时候触发,参数包括: //rowIndex:编辑行的索引,索引从0开始。 //rowData:对应于编辑行的记录 onBeforeEdit: function (rowIndex, rowData) { }, // 在用户完成编辑一行的时候触发,参数包括: //rowIndex:编辑行的索引,索引从0开始。 //rowData:对应于完成编辑的行的记录。 //changes:更改后的字段(键)/值对 onAfterEdit: function (rowIndex, rowData, changes) { }, // 在用户取消编辑一行的时候触发,参数包括: //rowIndex:编辑行的索引,索引从0开始。 //rowData:对应于编辑行的记录 onCancelEdit: function (rowIndex, rowData) { }, //在鼠标右击数据表格表格头的时候触发 onHeaderContextMenu: function (e, field) { }, //在鼠标右击一行记录的时候触发 onRowContextMenu: function (e, rowIndex, rowData) { } }); })(jQuery);
实例代码:
这里只是对grid进行的单个插件引入的例子进行简单的说明 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Frozen Columns in DataGrid - jQuery EasyUI Demo</title> <link rel="stylesheet" type="text/css" href="../../themes/default/easyui.css"> <link rel="stylesheet" type="text/css" href="../../themes/icon.css"> <link rel="stylesheet" type="text/css" href="../demo.css"> <script type="text/javascript" src="../../jquery-1.8.0.min.js"></script> <script src="../../plugins2/jquery.parser.js"></script> <script src="../../plugins2/jquery.panel.js"></script> <script src="../../plugins/jquery.resizable.js"></script> <script src="../../plugins2/jquery.linkbutton.js"></script> <script src="../../plugins/jquery.pagination.js"></script> <script src="../../plugins2/jquery.datagrid.js"></script> </head> <body> <h2>Frozen Columns in DataGrid</h2> <div class="demo-info"> <div class="demo-tip icon-tip"></div> <div>You can freeze some columns that can't scroll out of view.</div> </div> <div style="margin:10px 0;"></div> <table class="easyui-datagrid" title="Frozen Columns in DataGrid" style="width:700px;height:250px" data-options="rownumbers:true,singleSelect:true,url:'datagrid_data1.aspx'"> <thead data-options="frozen:true"> <tr> <th data-options="field:'itemid',width:100">Item ID</th> <th data-options="field:'productid',width:120">Product</th> </tr> </thead> <thead> <tr> <th data-options="field:'listprice',width:90,align:'right'">List Price</th> <th data-options="field:'unitcost',width:90,align:'right'">Unit Cost</th> <th data-options="field:'attr1',width:250">Attribute</th> <th data-options="field:'status',width:60,align:'center'">Status</th> </tr> </thead> </table> </body> </html>