前言

此前网上有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("&nbsp;");
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>

easyui源码翻译1.32--datagrid(数据表格)的更多相关文章

  1. easyui源码翻译1.32--ComboGrid(数据表格下拉框)

    前言 扩展自$.fn.combo.defaults和$.fn.datagrid.defaults.使用$.fn.combogrid.defaults重写默认值对象.下载该插件翻译源码 数据表格下拉框结 ...

  2. easyui源码翻译1.32+API翻译全篇导航 (提供下载源码)

    前言 EasyUI每个组件都会有 属性.方法.事件 属性 所有的属性都定义在jQuery.fn.{plugin}.defaults里面.例如,对话框属性定义在jQuery.fn.dialog.defa ...

  3. easyui源码翻译1.32--PropertyGrid(属性表格)

    前言 继承自$.fn.datagrid.defaults.使用$.fn.propertygrid.defaults重写默认值对象.下载该插件翻译源码 属性表格提供The propertygrid pr ...

  4. easyui源码翻译1.32--TreeGrid(树形表格)

    前言 扩展自$.fn.datagrid.defaults.使用$.fn.treegrid.defaults重写默认值对象.下载该插件翻译源码 树形表格用于显示分层数据表格.它是基于数据表格.组合树控件 ...

  5. easyui源码翻译1.32--EasyLoader(简单加载)

    前言 扩展自$.fn.datebox.defaults,使用$.fn.datetimebox.defaults重写默认值对象.下载该插件翻译源码 源码 /** * jQuery EasyUI 1.3. ...

  6. easyui源码翻译1.32--panel(面板)

    前言 昨天发布了表格datagrid的翻译源码 ,easyui的许多插件有依赖关系  比如datagrid 的渲染需要panel.resizable.linkbutton.pagination   今 ...

  7. easyui源码翻译1.32--Pagination(分页)

    前言 使用$.fn.pagination.defaults重写默认值对象下载该插件翻译源码 该分页控件允许用户导航页面的数据.它支持页面导航和页面长度选择的选项设置.用户可以在分页控件上添加自定义按钮 ...

  8. easyui源码翻译1.32--Tabs(选项卡)

    前言 使用$.fn.tabs.defaults重写默认值对象.下载该插件翻译源码 选项卡显示一批面板.但在同一个时间只会显示一个面板.每个选项卡面板都有头标题和一些小的按钮工具菜单,包括关闭按钮和其他 ...

  9. easyui源码翻译1.32--Form(表单)

    前言 使用$.fn.form.defaults重写默认值对象下载该插件翻译源码 form提供了各种方法来操作执行表单字段,比如:ajax提交, load, clear等等.当提交表单的时候可以调用va ...

随机推荐

  1. 在windows7中使用计划任务命令SCHTASKS查询计划任务失败的解决方案

    造成这种原因是因为编码问题: 因此需要修改编码:chcp schtasks.exe /query 会报错     错误: 无法加载列资源. 修改编码为936为436就可以允许啦,但是中文不不能显示啦. ...

  2. JavaScript最佳实践:可维护性

    代码约定 一.可读性 代码缩进 包含注释 二.变量和函数命名 变量名应为名词如car或person 函数名应该以动词开始,如getName().返回布尔类型值的函数一般以is开头,如isEnable( ...

  3. oracle经典操作sql

    分页: SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM <= 40)WH ...

  4. VS代码模板

    Microsoft Visual Studio 11.0\Common7\IDE\ItemTemplates\Csharp\Code\2052\Class

  5. alter和alert的一些问题

    今天在Java学习群里看到有人问:用alert能不能修改表结构?我第一反应是,alert是弹窗啊,怎么修改表结构?后来再看才知道,是那人打错了!我也晕了一下,还是记一下吧!alter是修改表结构的,a ...

  6. c# 两个数组比较,将重复部分去掉,返回不重复部分

    List<string> Ashuzu = new List<string>(); Ashuzu.Add("); Ashuzu.Add("); List&l ...

  7. Delphi Variant oleVariant

    The OleVariant type exists on both the Windows and Linux platforms. The main difference between Vari ...

  8. Spark Streaming揭秘 Day11 Receiver Tracker的具体实现

    Spark Streaming揭秘 Day11 Receiver Tracker的具体实现 ReceiverTracker是运行在Driver上Receiver管理程序,今天让我们深入学习一下. 核心 ...

  9. IOS6开发环境环境配置

    IOS6开发环境环境配置http://www.wizzer.cn/?p=2438http://diybbs.zol.com.cn/1/34037_629.htmlhttp://diybbs.zol.c ...

  10. EXTJS 4.2 资料 控件之Window窗体相关属性的用法

    最大化,最小化,是否显示关闭按钮 var win_CommonPicLibMultiple = Ext.create("Ext.window.Window", { title: & ...