web项目-easyui-datagrid使用汇总
一,引言
工作的需要,做了3年的wpf(mvvm)……,又因为项目的需求,回归到web的开发。
■ 3 years ago,vue是我三年前没用过的玩意儿。
■ 3 years ago,bootstrap组件没现在成熟。
■ 3 years ago,font awesome的普及度没有现在高。
■ 3 years ago,ui组件的选择也没有现在多。

二,项目的前端(easyui模板订制)
整个项目采用了oracle + dapper + castle + mvc + easyui的技术结合,本篇博客重点介绍easyui。
easyui的默认风格看久了很容易产生视觉疲劳,在这个项目中,我个性化订制风格。
订制easyui模板的工作量是挺大的,我用了一个偷懒的方法,花了几百块钱在网上买了几个easyui的皮肤(链接)然后对这些皮肤,进行优化和重构。
money比较紧的同学,可以去下载easyui的免费皮肤。

三,easyui-datagrid的基本使用:
1,加载数据
a,通过post,url的方法向后端请求数据,如图所示:

            $('#List').datagrid({
                title: "交易公司",
                loadMsg: '@CommonResource.Processing',
                toolbar: '#tb',
                width: "100%",
                height: "100%",
                //idField:"ID",
                //data: getData(),
                url: "@Url.Action("GetList")",
                methord: 'post',
                rownumbers: true,
                autoRowHeight: false,
                fit: true,
                //fitColumns: true,
                striped: true,      //奇偶行
                singleSelect: true,//单选模式
                checkOnSelect: false,
                selectOnCheck: false,
                collapsible: true,
                pagination: true,
                pageNumber: 1,
                pageSize: 10,
                pageList: [10, 20],
                queryParams: { },
                columns: [[
                    { field: 'Company_Name', title: '公司名称', width: 100, sortable: false },
                    { field: 'Abbreviation', title: '简称', width: 100, sortable: false },
                    { field: 'Business_Address', title: '经营地址', width: 100, sortable: false },
                    { field: 'Registered_Address', title: '注册地址', width: 100, sortable: false },
                    { field: 'Tel', title: '电话', width: 100, sortable: false },
                    { field: 'Fax', title: '传真', width: 100, sortable: false },
                    { field: 'Contactor', title: '联系人', width: 100, sortable: false },
                    { field: 'Payment', title: '结算方式', width: 100, sortable: false },
                    { field: 'Beneficiary_Name', title: '开户名称', width: 100, sortable: false },
                    { field: 'Beneficiary_Address', title: '开户地址', width: 100, sortable: false },
                    { field: 'Advising_Bank', title: '通知行', width: 100, sortable: false },
                    { field: 'Bank_Address', title: '银行地址', width: 100, sortable: false },
                    { field: 'Swift_Code', title: '银行代码', width: 100, sortable: false },
                    { field: 'Beneficiary_Account', title: '银行账户', width: 100, sortable: false },
                    { field: 'Company_Chop', title: '电子章', width: 100, sortable: false },
                    { field: 'Send_Url', title: '发件邮箱链接', width: 100, sortable: false },
                    { field: 'Send_Email', title: '发件人邮箱', width: 100, sortable: false },
                    { field: 'Remark', title: '备注', width: 100, sortable: false },
                    { field: 'Created_By', title: '创建人', width: 100, sortable: false },
                    { field: 'Creation_Date', title: '创建日期', width: 100, sortable: false },
                    { field: 'Modify_By', title: '修改人', width: 100, sortable: false },
                    { field: 'Modify_Date', title: '修改日期', width: 100, sortable: false },
                ]],
            });
        });
b,先定义好了datagrid的属性以及列,再通过loadData的方法设置datagrid的数据
$('#Detail').datagrid({
    loadMsg: '@CommonResource.Processing',
    toolbar: '#tb',
    width: "100%",
    height: "100%",
    //data: [],
    rownumbers: true,
    autoRowHeight: false,
    fit: true,
    fitColumns: true,
    striped: true,
    singleSelect: true,
    collapsible: false,
    pagination: false,
    queryParams: {  },
    columns: [[
        { field: 'Country_Name', title: '国家名称', width: 100, sortable: false },
        { field: 'Item_Number', title: '物料编码', width: 100, sortable: false },
    ]],
});
var returnData = JSON.parse(response.data);
$('#Detail').datagrid("loadData", returnData);
2,合并单元格
有时候用户需要如下图的效果

可以在datagrid的onLoadSuccess事件里增加如下代码:
onLoadSuccess: function (data) {
    //var opts = $('#List').datagrid('getColumnFields');
    var opts = new Array("Item_Number", "Country_Name", "Item_Desc", "Item_Desc_En", "Item_Type", "Unit", "Hs_Code", "Destination_Code", "Status", "Remark", "Create_User", "Create_Date");
    var rowsCount = data.rows.length;
    var mark = 1;
    for (var j = 1; j < rowsCount; j++)
    {
        var preCellVal = data.rows[j - 1]["Material_Id"];
        var currentCellVal = data.rows[j]["Material_Id"];
        if (preCellVal == currentCellVal) {
            mark += 1;
            for (var c = 0; c < opts.length; c++) {
                var columnName = opts[c];
                $(this).datagrid('mergeCells', {
                    field: columnName,
                    index: j + 1 - mark,
                    rowspan: mark
                });
            }
        }
        else {
            mark = 1;
        }
    }
},
3,行,列变色

针对这样的行,列变色效果:
a,行变色

$('#Detail').datagrid({
    loadMsg: '@CommonResource.Processing',
    toolbar: '#tb',
    width: "100%",
    height: "100%",
    url: "@Url.Action("GetLines")",
    methord: 'post',
    rownumbers: true,
    autoRowHeight: false,
    fit: true,
    fitColumns: true,
    striped: true,
    singleSelect: true,
    collapsible: false,
    pagination: false,
    queryParams: { hid: $("#Hid").val() },
    columns: [[
        { field: 'Material_No', title: '物料号', width: 100, sortable: false },
        { field: 'Description', title: '中文描述', width: 100, sortable: false },
        { field: 'En_Description', title: '英文描述', width: 100, sortable: false },
        { field: 'Unit', title: '单位', width: 100, sortable: false },
        { field: 'Quantity', title: '工单数量', width: 100, sortable: false },
        { field: 'Total_Actual_Send_Quantity', title: '已出货数量', width: 100, sortable: false },
        { field: 'Remark', title: '备注', width: 100, sortable: false },
    ]],
    rowStyler: function (index, row) {
        if (row.Quantity == 0) {
            return 'background-color:pink;color:blue;font-weight:bold;';
        }
    },
});
b,列变色
$('#Detail').datagrid({
    loadMsg: '@CommonResource.Processing',
    width: "100%",
    height: "100%",
    data: [],
    rownumbers: true,
    autoRowHeight: false,
    fit: true,
    fitColumns: true,
    striped: true,
    singleSelect: true,
    checkOnSelect: false,
    selectOnCheck: false,
    collapsible: false,
    pagination: false,
    queryParams: {},
    columns: [[
        { field: 'sel', checkbox: true },
        { field: 'Material_No', title: '物料号', width: 80, sortable: false },
        { field: 'Description', title: '中文描述', width: 80, sortable: false },
        { field: 'Unit', title: '单位', width: 80, sortable: false },
        { field: 'Quantity', title: '工单数量', width: 80, sortable: false },
        { field: 'Total_Actual_Send_Quantity', title: '已出货数量', width: 80, sortable: false },
        { field: 'Remain_Quantity', title: '剩余数量', width: 80, sortable: false },
        {
            field: 'Actual_Send_Quantity', title: '本次出货', width: 80, sortable: false,
            editor: { type: 'numberbox', options: { required: true, min: 0 }, },
            styler: function (value, row, index) {
                return 'background-color:#ecffff;';
            },
        },
        {
            field: 'Remark', title: '备注', width: 80, sortable: false,
            editor: { type: 'textbox', options: { validType: 'length[1,20]' }, },
            styler: function (value, row, index) {
                return 'background-color:#ecffff;';
            },
        },
    ]],
4,为datagrid添加工具条
如下效果的工具条,是通过datagrid的 toolbar 属性来指定,要留意的是toolbar的控件名称需要加上#符号。

html代码:
<div id="tb">
<a id='condition' href='#' class='btn btn-default more'><i class='fa fa-ellipsis-v'></i>  查询条件</a>
@Html.ToolButton(string.Format(@"<a id='btnCreate' href='#' class='btn btn-default'><i class='fa fa-plus'></i>  {0}</a>", @CommonResource.Add), ActionCode.Create)
@Html.ToolButton(string.Format(@"<a id='btnEdit' href='#' class='btn btn-default'><i class='fa fa-pencil'></i>  {0}</a>", @CommonResource.Edit), ActionCode.Edit)
@Html.ToolButton(string.Format(@"<a id='btnDelete' data-content='Delete 1' href='#' class='btn btn-primary'><i class='fa fa-trash'></i>  {0}</a>", @CommonResource.Delete), ActionCode.Delete)
</div>
js代码:
5,做增,删,改操作
a,为datagrid增加一行
function addCallBack(data) {
    $('#List').datagrid('insertRow', {
        index: 0,
        row: data,
    });
    layer.msg('@CommonResource.AddSuccess', { icon: 1, time: 1000 });
}
b,为datagrid编辑一行
function editCallBack(data) {
    var selectData = $('#List').datagrid('getSelected');
    var selectIndex = $('#List').datagrid('getRowIndex', selectData);
    $('#List').datagrid('updateRow', {
        index: selectIndex,
        row: data,
    });
    layer.msg('@CommonResource.ModifySuccess', { icon: 1, time: 1000 });
}
c,为datagrid删除一行
$("#btnLineDelete").click(function () {
    var row = $('#Detail').treegrid('getSelected');
    if (row != null) {
        var rowIndex = $('#Detail').datagrid('getRowIndex', row);
        $('#Detail').datagrid('deleteRow', rowIndex);
        layer.msg('@CommonResource.DeleteSuccess', { icon: 1, time: 1000 });
    }
    else {
        layer.msg('@CommonResource.Noselectedrecord', { icon: 2, time: 1000 });
    }
});
d,treegrid的操作方法略有区别,附上源码:
    function addCallBack(data) {
        var row = $('#List').treegrid('getSelected');
        $('#List').treegrid('append', {
            parent: data.Parent_Id,
            data: [{
                Id: data.Id,
                Name: data.Name,
                En_Name:data.En_Name,
                Code: data.Code,
                Enable: data.Enable,
                Sort: data.Sort,
            }]
        });
        layer.msg('@CommonResource.AddSuccess', { icon: 1, time: 1000 });
    }
    function editCallBack(data) {
        var row = $('#List').treegrid('getSelected');
        $('#List').treegrid('update', {
            id: row.Id,
            row: {
                Name: data.Name,
                En_Name: data.En_Name,
                Code: data.Code,
                Enable: data.Enable,
                Sort: data.Sort,
            }
        });
        layer.msg('@CommonResource.ModifySuccess', { icon: 1, time: 1000 });
    }
    $("#btnDelete").click(function () {
        var row = $('#List').treegrid('getSelected');
        if (row != null) {
            layer.confirm('@CommonResource.ConfirmDelete', {
                btn: ['@CommonResource.Sure', '@CommonResource.Cancel'],
                shadeClose: true,
            }, function () {
                if (row.ChildCount == 0 || typeof (row.ChildCount) == 'undefined') {
                    $.post("@Url.Action("Delete")/" + row.Id, function (data) {
                        if (data == "1") {
                            $("#List").treegrid('remove', row.Id);
                            layer.msg('@CommonResource.DeleteSuccess', { icon: 1, time: 1000 });
                        }
                        else {
                            layer.msg('@CommonResource.DeleteFailed', { icon: 2, time: 1000 });
                        }
                    }, "json");
                }
                else {
                    layer.msg('@CommonResource.Noselectedrecord', { icon: 2, time: 1000 });
                }
            }, function () {
            });
        }
        else {
            layer.msg('@CommonResource.Noselectedrecord', { icon: 2, time: 1000 });
        }
    });
6,编辑单元格

具体代码实现
        var taxTypeList = JSON.parse($("#taxTypeList").val());
        var manufactureList = JSON.parse($("#manufactureList").val());
        $.extend($.fn.datagrid.methods, {
            editCell: function (jq, param) {
                return jq.each(function () {
                    var opts = $(this).datagrid('options');
                    var fields = $(this).datagrid('getColumnFields', true).concat($(this).datagrid('getColumnFields'));
                    for (var i = 0; i < fields.length; i++) {
                        var col = $(this).datagrid('getColumnOption', fields[i]);
                        col.editor1 = col.editor;
                        if (fields[i] != param.field) {
                            col.editor = null;
                        }
                    }
                    $(this).datagrid('beginEdit', param.index);
                    for (var i = 0; i < fields.length; i++) {
                        var col = $(this).datagrid('getColumnOption', fields[i]);
                        col.editor = col.editor1;
                    }
                });
            }
        });
        var editIndex = -1;
        function endEditCal() {
            if (editIndex == -1) {
                return true;
            }
            if ($('#Detail').datagrid('validateRow', editIndex)) {
                $('#Detail').datagrid('endEdit', editIndex);
                editIndex = -1;
                return true;
            }
            else {
                return false;
            }
        }
        $('#Detail').datagrid({
            loadMsg: '@CommonResource.Processing',
            toolbar: '#tb',
            width: "100%",
            height: "100%",
            data: JSON.parse($("#MaterialDetailListStr").val()),
            rownumbers: true,
            autoRowHeight: false,
            fit: true,
            fitColumns: true,
            striped: true,
            singleSelect: true,
            collapsible: false,
            pagination: false,
            queryParams: {  },
            columns: [[
                {
                    field: 'Material_Use', title: '用途', width: 100, sortable: false,
                    formatter: function (value) {
                        for (var i = 0; i < manufactureList.length; i++) {
                            if (manufactureList[i].Key == value) return manufactureList[i].Value;
                        }
                        return value;
                    },
                    editor: {
                        type: 'combobox',
                        options: {
                            valueField: 'Key',
                            textField: 'Value',
                            data: manufactureList,
                            required: true,
                            panelHeight: "auto",
                            editable:false,
                        }
                    },
                },
                {
                    field: 'Tax_Type', title: '税别', width: 100, sortable: false,
                    formatter: function (value) {
                        for (var i = 0; i < taxTypeList.length; i++) {
                            if (taxTypeList[i].Key == value) return taxTypeList[i].Value;
                        }
                        return value;
                    },
                    editor: {
                        type: 'combobox',
                        options: {
                            valueField: 'Key',
                            textField: 'Value',
                            data: taxTypeList,
                            required: true,
                            panelHeight: "auto",
                            editable: false,
                        }
                    },
                },
                { field: 'Tax_Bcd', title: 'BCD', width: 100, sortable: false, editor: { type: 'numberbox', options: { required: true, suffix: '%', precision: 2, min: 0, max: 100, } } },
                { field: 'Tax_Cess', title: 'CESS', width: 100, sortable: false, editor: { type: 'numberbox', options: { required: true, suffix: '%', precision: 2, min: 0, max: 100, } } },
                { field: 'Tax_Igst', title: 'IGST', width: 100, sortable: false, editor: { type: 'numberbox', options: { required: true, suffix: '%', precision: 2, min: 0, max: 100, } } },
            ]],
            @if (Request.Params["Operate"] != "View")
                {
                    <text>
                    onClickCell: function (index, field, value) {
                        if (endEditCal()) {
                            $(this).datagrid('selectRow', index).datagrid('editCell', { index: index, field: field }); //编辑一个单元格
                            //$(this).datagrid('beginEdit', index); //编辑一行
                            editIndex = index;
                        }
                        else {
                            layer.msg('当前行的数据编辑有误', { icon: 2, time: 1000 });
                        }
                    },
                    onAfterEdit: function (index, row, changes) {
                        var rowData = $(this).datagrid('getData').rows[index];
                        $('#Detail').datagrid('updateRow', {
                            index: index,
                            row: {},
                        });
                    },
                    onLoadSuccess: function (data) {
                        for (var index = 0; index < data.rows.length; index++) {
                            $(this).datagrid('beginEdit', index);
                        }
                    },
                    </text>
                }
        });
        $("#btnLineCreate").click(function () {
            if (endEditCal()) {
                editIndex = 0;
                $('#Detail').datagrid('insertRow', {
                    index: editIndex,
                    row: {},
                });
                $('#Detail').datagrid('selectRow', editIndex);
                $('#Detail').datagrid('beginEdit', editIndex);
            }
            else {
                layer.msg('当前行的数据编辑有误', { icon: 2, time: 1000 });
            }
        });
        $("#btnLineDelete").click(function () {
            var row = $('#Detail').treegrid('getSelected');
            if (row != null) {
                var rowIndex = $('#Detail').datagrid('getRowIndex', row);
                $('#Detail').datagrid('deleteRow', rowIndex);
                layer.msg('@CommonResource.DeleteSuccess', { icon: 1, time: 1000 });
            }
            else {
                layer.msg('@CommonResource.Noselectedrecord', { icon: 2, time: 1000 });
            }
        });
        $("#btnSave").click(function () {
            var summaryValidate = true;
            var rows = $("#Detail").datagrid("getRows");
            $(rows).each(function (index, itemData) {
                if ($('#Detail').datagrid('validateRow', index)) {
                    $('#Detail').datagrid('endEdit', index);
                }
                else {
                    summaryValidate = false;
                    return false;
                }
            });
            if (summaryValidate) {
                if (rows.length == 2) {
                    $("#MaterialDetailListStr").val(JSON.stringify(rows));
                }
                else {
                    layer.msg('税别,用途应该设置为2行数据', { icon: 2, time: 1000 });
                    return false;
                }
            }
            else {
                layer.msg('当前表单数据编辑有误', { icon: 2, time: 1000 });
                return false;
            }
            var check = $('form').form('validate');
            if (check) {
                $.ajax({
                    url: "@Url.Action("CreateMaterial")",
                    type: "Post",
                    data: $("form").serialize(),
                    dataType: "json",
                    success: function (data) {
                        if (data.Key == "1") {
                            parent.$("#List").datagrid('reload');
                            var index = parent.layer.getFrameIndex(window.name);
                            parent.layer.close(index);
                            parent.layer.msg('@CommonResource.AddSuccess', { icon: 1, time: 1000 });
                        }
                        else {
                            layer.msg("物料编号'" + data.Value.Item_Number + "'在数据库中已添加", { icon: 2, time: 1000 });
                        }
                    },
                    error: function (jqXHR, textStatus, errorThrown) {
                        layer.msg('@CommonResource.AddFailed', { icon: 2, time: 1000 });
                    }
                });
            }
        });
7,重置datagrid布局 $('#List').datagrid("resize");
$(function () {
    $(".more").click(function () {
        $(this).closest(".conditions").siblings().toggleClass("hide");
        $('#List').datagrid("resize");
    });
})
四,总结
这些技巧,在帮助文档里也说的很详细,我只是把这些技术用于实践。喜欢的可以点个“推荐”,让更多的同学能从中受益。
web项目-easyui-datagrid使用汇总的更多相关文章
- 反射实体自动生成EasyUi DataGrid模板 第二版--附项目源码
		之前写过一篇文章,地址 http://www.cnblogs.com/Bond/p/3469798.html 大概说了下怎么通过反射来自动生成对应EasyUi datagrid的模板,然后贴了很多 ... 
- EasyUI:datagrid数据汇总
		EasyUI:datagrid数据汇总 js代码: var total=0;//全局变量 $(function(){ $('#tablebudgetdata').datagrid({ title:' ... 
- 64位系统web项目导出excel问题分析及解决方法汇总
		最近在web项目中做了一个导出Excel功能.在导出的时候报错:检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件时失败. 一 ... 
- 反射实体自动生成EasyUi DataGrid模板
		用EasyUi Datagrid展示数据的时候总是要一下这样一段代码 <table id="dt" class="easyui-datagrid"> ... 
- 数据网格和树-EasyUI Datagrid 数据网格、EasyUI Propertygrid 属性网格、EasyUI Tree 树、EasyUI Treegrid 树形网格
		EasyUI Datagrid 数据网格 扩展自 $.fn.panel.defaults.通过 $.fn.datagrid.defaults 重写默认的 defaults. 数据网格(datagrid ... 
- easyui datagrid 禁止选中行    EF的增删改查(转载)   C# 获取用户IP地址(转载)  MVC EF 执行SQL语句(转载)    在EF中执行SQL语句(转载)  EF中使用SQL语句或存储过程  .net MVC使用Session验证用户登录  PowerDesigner 参照完整性约束(转载)
		easyui datagrid 禁止选中行 没有找到可以直接禁止的属性,但是找到两个间接禁止的方式. 方式一: //onClickRow: function (rowIndex, rowData) ... 
- EasyUI Datagrid的简单使用
		此前同样写过EasyUI Datagrid的demo,好记性不如烂笔头,何况记性也不是那么好,赶紧记录一下.照搬上一篇EasyUI Tree的格式. 实现效果:获取数据库表的数据,在EasyUI Da ... 
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(8)-MVC与EasyUI DataGrid 分页
		系列目录 前言 为了符合后面更新后的重构系统,文章于2016-11-1日重写 EasyUI Datagrid在加载的时候会提交一些分页的信息到后台,我们需要根据这些信息来进行数据分页再次返回到前台 实 ... 
- 控制EasyUI DataGrid高度
		这次要说的是控制EasyUI的高度,平时我公司的项目,用EasyUI较多,然后datagrid这个组件是用的非常多的.平时我们都是固定高度,常见代码如下: <table ... 
- easyui datagrid标题列宽度自适应
		最近项目中使用easyui做前端界面,相信大部分使用过easyui datagrid的朋友有这么一个疑问:如果在columns中不设置width属性能不能写个方法让datagrid的头部标题和数据主体 ... 
随机推荐
- Python数据类型及其方法详解
			Python数据类型及其方法详解 我们在学习编程语言的时候,都会遇到数据类型,这种看着很基础也不显眼的东西,却是很重要,本文介绍了python的数据类型,并就每种数据类型的方法作出了详细的描述,可供知 ... 
- bootstrap-table前台和后台分页对json格式的要求
			Bootstrap是一款前端非常流行的框架,其中的表格更为大家经常使用.大家都知道表格的分页分为前台和后台分页,也就是表格配置中sidePagination属性,当sidePagination: &q ... 
- VMware中Linux系统时间与主机同步以及时区设置
			网络上有各种资料,但最简单的一种方法就是修改虚拟机的配置文件 *.vmx .修改 tools.syncTime = "FALSE" 为 tools.syncTime = " ... 
- url地址栏拼接参数写法
			<script> function jiedan_do(elm){ var id=$(elm).attr("a"); window.location="__U ... 
- Unity 游戏框架搭建 (一) 概述
			为了重构手头的一款项目,翻出来当时未接触Unity时候收藏的视频<Unity项目架构设计与开发管理>,对于我这种初学者来说全是干货.简单的总结了一下,以后慢慢提炼. 关于Unity的架 ... 
- 使用docker-compose搭建AspNetCore开发环境
			1 使用docker-compose搭建开发环境 我们的目标很简单:使用docker-compose把若干个docker容器组合起来就成了. 首先使用Nginx代理所有的Web程序,这样只需要在主机上 ... 
- jap页面获取struts2中action中变量的值
			在jsp页面中可以通过ONGL表达式获取struts2中action处理后的变量的值,这是因为每一个action在初始化后都会放到strackcontext中,可以通过ONGL表达式取到值. 注意要在 ... 
- (转载)oracle的v$sqlarea表
			原文摘自:http: [V$SQLAREA] 本视图持续跟踪所有shared pool中的共享cursor,在shared pool中的每一条SQL语句都对应一列.本视图在分析SQL语句资源使用方面 ... 
- Chrome浏览器扩展开发系列之十六:扩展中可用的Chrome浏览器API
			除了Chrome浏览器支持的chrome.* API之外,Chrome浏览器扩展还可以使用Chrome浏览器为Web页面或Chrome app提供的APIs.对于Chrome浏览器2支持的API,还可 ... 
- voa 2015 / 4 / 26
			Now, Words and Their Stories, a VOA Special English program about American expressions. I'm Rich Kle ... 
