• easyui源码翻译1.32--datagrid(数据表格)


    前言

    此前网上有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", {  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",  "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 + " {" + col.boxWidth + "px;}");
                    }
                }
                ss.push("</style>");
                $(ss.join("
    ")).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,
                    {
                         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);
    View Code

    示例代码

    这里只是对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="700px;height:250px" data-options="rownumbers:true,singleSelect:true,url:'datagrid_data1.aspx'"> <thead data-options="frozen:true"> <tr> <th data-options="field:'itemid',100">Item ID</th> <th data-options="field:'productid',120">Product</th> </tr> </thead> <thead> <tr> <th data-options="field:'listprice',90,align:'right'">List Price</th> <th data-options="field:'unitcost',90,align:'right'">Unit Cost</th> <th data-options="field:'attr1',250">Attribute</th> <th data-options="field:'status',60,align:'center'">Status</th> </tr> </thead> </table> </body> </html>
  • 相关阅读:
    上传本地项目到git服务器
    linux服务器部署web环境(一)
    nginx+tomcat负载集群部署
    selenium学习历程(二)
    selenium学习历程(一)
    在 Acer p236 上装 win7 和 ubuntu 双系统
    Ubuntu (14.04) 如何安装和配置Qt
    Android 蓝牙的常用操作
    OpenCL: Shared memory between CPU and GPU in Android development of Qaulcomm plateform
    Android 系统支持的编解码器
  • 原文地址:https://www.cnblogs.com/DemoLee/p/3466526.html
Copyright © 2020-2023  润新知