码迷,mamicode.com
首页 > 其他好文 > 详细

easyui dategrid 操作示例

时间:2014-12-05 15:31:41      阅读:911      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   http   io   ar   color   os   使用   

Datagrid数据绑定

说明:datagrid为页面中使用到的一个datagrid的实例:

    var datagrid;

    var editRow = undefined; //定义当前正在编辑的行

    var selectRow = undefined;//当前选择行

    $(function () {

        datagrid = $(‘#tabInfo‘).datagrid({

            url: ‘/easyUITest/Ashx/center.ashx?type=getUser‘,

            ……

        }); //datagrid end

    });

 

1. 绑定列

Eg:  columns:[[

 { field: ‘ID‘, title: ‘编号‘, width: 100,sortable:true,order:‘asc‘ },

{}

]]

 

Msg: 字段中只有field时必不可少的的,而且field的字段要与数据库一致,区分大小写。

2. 分页

涉及分页的属性

 pagination: true, //是否在grid底部显示分页

 pageSize: 10, //每页显示的行数

 pageList: [10, 20, 30],//页面显示行数的显示列表

 

要求c#返回的信息为一个json对象  返回对象格式

Total: 查询数据的总长度

Rows:要绑定的数据源

 

C# 返回字符串

int totalCount=20;//数据总长度,可以从数据库获取

            string strResult = "{\"total\":" + totalCount + ",\"rows\":" + Common.JsonHelper.ToJson(dt) + "}";  //dt为获取的一个table,ToJson为转换json的方法        

            context.Response.Write(strResult);

 

3. 排序

1> datagrid属性中指定页面第一次初始化要遵循的排序字段和排序规则

sortName: ‘Name‘,

sortOrder: ‘asc‘,

2> 在列属性中给要排序的字段启用排序

columns: [[

                { field: ‘ID‘, title: ‘编号‘, width: 100,sortable:true,order:‘asc‘ },

                { field: ‘Name‘, title: ‘姓名‘, width: 100, sortable: true, order: ‘asc‘ }

]]

 

4. 查询

 使用datagridload 方法

//方式一: 在查询参数少的时候可以将查询条件逐个传递

function FunSearch() {

    datagrid.datagrid(‘load‘, {

        ID:$(‘input[name=txtID]‘).val(),

        Name:$(‘input[name=txtName]‘).val()

    });

}

 

//方式二: 在查询条件较多的时候,将form表单序列换一个对象

function FunSearch() {

    datagrid.datagrid(‘load‘, serializeObject($(‘#frmSearch‘).form())

    );

}

bubuko.com,布布扣
function serializeObject(form) {

    var o = {};

    $.each(form.serializeArray(), function (index) {

        if (o[this[name]]) {

            o[this[name]] = o[this[name]] + "," + this[value];

        } else {

            o[this[name]] = this[value];

        }

    });

    return o;

}
扩展方法(表单序列化为对象)

将要传递的查询参数放在load参数中,浏览器默认以post方式提交到后台.

 

5. 新增记录

 Way1: 打开独立窗口增加

bubuko.com,布布扣
function FunShowAddForm() {

        var strContent = "<form id=‘frmAdd‘> <table id=‘tblAdd‘ style=‘width:100%;height:100%; padding:5px 20px‘>"

         + "<tr><th>Name:</th><td><input name=‘addName‘ type=‘text‘/></td></tr>"

           + "<tr><th>Password:</th><td><input name=‘addPassword‘ type=‘text‘/></td></tr>"

 

        +"</table></form>";

        $(<div/>).dialog({

            id: divAdd,

            title: 新建用户,

            width: 400,

            height: 300,

            closed: false,

            modal: true,

            content: strContent,

            buttons: [{

                text: 保存,

                iconCls: icon-save,

                handler: function () {

                    $.ajax({

                        url: /easyUITest/Ashx/center.ashx?type=addUser,

                        type: post,

                        cache: false,

                        dataType: json,

                        data: $(#frmAdd).serialize(),

                        success: function (r) {

                            console.info(r);

                            if (r == "1") {

                                $(#divAdd).dialog(destroy); //销毁当前窗体

                                datagrid.datagrid(load, {}); //重新刷新datagrid

                                $.messager.show({

                                    title:提示,

                                    msg:添加新用户成功!,

                                    timeout:2000,

                                    showType:slide

                                });

                            }

                        },

                        error: function () {

                            alert(error);

                        }

                    });

                }

            }]

        });

    }
新建窗口作为编辑对话框

Msg: 每次打开时新建一个窗口,在经ajax把数据处理完成后,将当前的dialog销毁,并重新刷新datagrid

 

Way2:行内编辑模式新增

1> datagridcolumns增加editor属性

bubuko.com,布布扣
Eg:  columns: [[

                { field: Name, title: 姓名, width: 100, sortable: true, order: asc,

                    editor: { type: validatebox, options: { required: true} }

                },

                { field: CreateDate, title: 创建时间, width: 100,

                    editor: { type: datetimebox, options: { required: true} },

                    styler: function (value, rowData, rowIndex) {

                        if (parseInt(value) >= 20) {

                            return color:red;;

                        }

                    }

                }

            ]]
editor属性编辑
bubuko.com,布布扣
$.extend($.fn.datagrid.defaults.editors, {

    datetimebox: {

        init: function (container, options) {

            var input = $(<input />).appendTo(container);

            options.editable = false;

            input.datetimebox(options);

            return input;

        },

        getValue: function (target) {

            return $(target).datetimebox(getValue);

        },

        setValue: function (target, value) {

            $(target).datetimebox(setValue,value);

        },

        resize: function (target, width) {

            $(target).datetimebox(resize, width);

        },

        destroy: function (target) {

            $(target).datetimebox(destroy);

        }

    }

});  
为editor属性扩展的datetimebox

 

2> 点击按钮开启编辑模式

bubuko.com,布布扣
   function FunAddForm() {

        if (editRow == undefined) {//为防止出现多个编辑行,当前已经存在编辑行的时候,不再新建编辑行

            datagrid.datagrid(insertRow, {

                index: 0,

                row: { Name: 请输入姓名!, Password: 请输入密码! }

            });

            datagrid.datagrid(beginEdit, 0);//第0行开启编辑模式

            editRow = 0;

        }

}
beginEdit开启新的编辑行
bubuko.com,布布扣
function FunSave() {

        datagrid.datagrid(endEdit,editRow);//参数editRow为当前正在编辑的行索引,同时会触发datagrid的onAfterEdit事件

    }
endEdit结束行编辑

 

bubuko.com,布布扣
 /* 在用户进行新建、更新、删除事件处理完成后,均使用endEdit方式结束datagrid的行编辑状态,然后再onAfterEdit事件中处理数据提交 */
            onAfterEdit: function (rowIndex, rowData, Changes) {//在结束编辑时触发
                var inserted = datagrid.datagrid(getChanges, inserted); //getChanges获取上次提交改变的行,改变的类型有 inserted\updated\deleted三种
                console.info(inserted: + inserted);
                var updated = datagrid.datagrid(getChanges, updated);
                console.info(updated: + updated);
                var deleted = datagrid.datagrid(getChanges, deleted);
                console.info(deleted: + deleted);
                var url = ‘‘;
                if (inserted.length > 0) {
                    url = /easyUITest/Ashx/center.ashx?type=addUser;
                }
                if (updated.length > 0) {
                    url = /easyUITest/Ashx/center.ashx?type=updateUser;
                }

                $.ajax({
                    url: url,
                    type: post,
                    data: rowData,
                    dataType: text,
                    cache: false,
                    success: function (r) {//r==‘1‘成功, r==‘0‘失败
                        if (r == 1) {
                            datagrid.datagrid(acceptChanges); //提交上一次更改的数据
                            $.messager.show({
                                title: 成功,
                                msg: 数据提交成功!,
                                timeout: 2000,
                                showType: slide
                            });
                        } else {
                            datagrid.datagrid(rejectChanges); //在数据提交失败的时候回滚操作
                            $.messager.alert(错误, r.msg, error);
                        }
                        editRow = undefined; //通过编辑验证之后,将当前编辑的行再次设为undefined(需要在数据异步提交完成之后进行)
                    },
                    error: function (r) {
                        console.info(error);
                        editRow = undefined; //通过编辑验证之后,将当前编辑的行再次设为undefined
                    }
                });
            }
endEdit方法触发的onAfterEdit事件

 

3>撤销编辑

  当需要撤销编辑时,可以使用dategird的撤销编辑事件

bubuko.com,布布扣
function FunEditRedo() {
        if (editRow != undefined) {
            datagrid.datagrid(cancelEdit,editRow);
           // datagrid.datagrid(‘rejectChanges‘);
        }
    }
cancelEdit结束行编辑
bubuko.com,布布扣
onCancelEdit: function (rowIndex, rowData) {

                alert("您取消了第 " + rowIndex + " 行的编辑!");

            }
cancelEdit方法触发的onCancelEdit事件

 

6. 修改记录

Way1: 用户选择一行,点击修改按钮,进入编辑模式

bubuko.com,布布扣
   function FunEdit() {

        var rows = datagrid.datagrid(getSelections);

        if (rows.length == 1) {//当用户只选中一行的时候,启用编辑模式

            var rowIndex = datagrid.datagrid(getRowIndex, rows[0]);//这里的rows时一个数组,rows[0]是数组的第一项,因此rows[0]才是一个真正的对象,不能混淆

 

            editRow = rowIndex;

            datagrid.datagrid(beginEdit,rowIndex);

        }

}
获取当前被选中的行进入编辑模式

  然后的处理同新建数据一样,在jsc#后台传递数据的时候,可以将rows[0]对象传递过去。

Way2: 用户双击当前行的时候,可以修改当前行的数据

bubuko.com,布布扣
 onDblClickCell: function (rowIndex, field, value) {//单元格双击事件,开启行编辑模式

                datagrid.datagrid(beginEdit, rowIndex); //开启行编辑模式

                editRow = rowIndex; //设置当前正在编辑的行索引

            }
使用datagrid的onDblClickCell事件使当前行进入编辑模式

 

7. 删除记录

bubuko.com,布布扣
 function FunShowDelete() {

        var rows = datagrid.datagrid(getSelections);//不能选中所有的行      

        if (rows.length >0) {//当用户只选中一行的时候,启用编辑模式

            $.messager.confirm(请确认, 您确认要删除记录吗?, function (r) {

                if (r) {

                    // FunDelete(rows[0]);//这里的rows时一个数组,rows[0]是数组的第一项,因此rows[0]才是一个真正的对象,不能混淆

                    FunDelete(rows);                

                }

            });

        }

    }
获取被选中的行 删除提示
bubuko.com,布布扣
 function FunDelete(rows) {

        if (rows.length > 0) {

            var idlist = new Array();

            for (var i = 0; i < rows.length; i++) {

                idlist.push(rows[i].ID);

            }

            console.info(idlist:+idlist);

            $.ajax({

                url: /easyUITest/Ashx/center.ashx?type=delete,

                type: post,

                dataType: text,

                cache: false,

                // data: ‘{\"idlist\":\"‘+idlist+‘\"}‘,

                data: idlist= + idlist,

                success: function (r) {

                    $.messager.show({

                        title: 提示,

                        msg: 记录删除成功!,

                        timeout: 2000,

                        showType: slide

                    });

                    //重新刷新数据

                    datagrid.datagrid(load, {});

                },

                error: function (r) {

                    console.info(delete error);

                }

 

            });

        }

    }
提交删除记录

  这里先使用getSelections方法获取当前被选中的所有行(如果datagridsingleSelect属性被设置为true,则只能获取到一行),然后把每行的ID字段合并,传递的后台处理。

  在这里遇到一个问题是我在页面中选择了多行记录,但是在

  var rows = datagrid.datagrid(‘getSelections‘);  一条语句中获取到的只是最后一条记录。

  原因是我在开始的时候为datagrid设置了 idField: ‘id‘,并且又在columns中的ID字段设置其checkboxtrue,这样ID字段没有显示,datagrid就认为页面中所有记录的ID均是相同的,所有就只获取到组后一条记录。

  解决办法是: 1:在页面中显示ID字段

             2: 取消idField属性或将其设为其他字段

 

8. 扩展datagrid 动态添加和删除列的editor属性

  创建原因:比如在记录中的一些字段(用户密码等),我们希望在创建记录的时候,该字段可以编辑,但是在修改的时候该字段不可编辑,这是即需要我们在新建一条记录的时候为该字段添加editor属性,在修改一条记录的时候解除该字段的editor属性

使用示例:

添加editor属性:

datagrid.datagrid(‘addEditor‘, {//为密码项动态添加editor属性

                field: ‘Password‘,

                editor: { type: ‘validatebox‘, options: { required: true} }

            }); 

删除editor属性:

     datagrid.datagrid(‘removeEditor‘, ‘Password‘);//单个字段

  datagrid.datagrid(‘removeEditor‘, [‘Password‘,‘Address‘]);//多个字段

bubuko.com,布布扣
$.extend($.fn.datagrid.methods, {

    addEditor: function (jq, param) {

        if (param instanceof Array) {

            $.each(param, function (index, item) {

                var e = $(jq).datagrid(getColumnOption, item.field);

                e.editor = item.editor;

            });

        } else {

            var e = $(jq).datagrid(getColumnOption, param.field);

            e.editor = param.editor;

        }

    },

    removeEditor: function (jq, param) {

        if (param instanceof Array) {

            $.each(param, function (index, item) {

                var e = $(jq).datagrid(getColumnOption, item);

                e.editor = {};

            });

        } else {

            var e = $(jq).datagrid(getColumnOption, param);

            e.editor = {};

        }

    }

});
动态添加和删除editor的扩展方法

 

9. 合并行/列事件

Jeasyui.com网站上的示例:

bubuko.com,布布扣
onLoadSuccess: function (data) {//数据加载成功时触发

                console.info(data load ok!);

                var merges = [{

                    index: 2, rowspan: 2

                }, {

                    index: 5, rowspan: 2

                }, {

                    index: 7, rowspan: 2

                }];

                for (var i = 0; i < merges.length; i++) {

                    datagrid.datagrid(mergeCells, {

                        index: merges[i].index,

                        field: Address,

                        rowspan: merges[i].rowspan

                    });

                }

            }
onLoadSuccess中加载行列的合并代码

onLoadSuccessdatagrid的一个事件,在数据全部加在成功时触发,先定义一个需要 合并行的数组,然后使用mergeCells方法为merges里的行合并单元格。

 

10. 右键菜单

 1>在当前页面中添加一个用于显示右键菜单的div 默认隐藏,classeasyui-menu(因为之后要用easyui的方式将其显示出来)

bubuko.com,布布扣
Eg: 

<div id="menu" class="easyui-menu" style="width:120px; display:none">

           <div onclick="FunAddForm()" iconCls="icon-add">新建</div>

            <div onclick="FunEdit()" iconCls="icon-remove">编辑</div>

           <div onclick="FunShowDelete()" iconCls="icon-edit">删除</div>

        </div>
右键显示菜单

2> 添加datagridonRowContextMenu事件 

bubuko.com,布布扣
 onRowContextMenu: function (e, rowIndex, rowData) {

                console.info(right click!);

                e.preventDefault(); //取消浏览器默认的右键菜单

                datagrid.datagrid(unselectAll);

                datagrid.datagrid(selectRow, rowIndex);

                $(#menu).menu(show, {

                    left: e.pageX,

                    top: e.pageY

                });

            }
onRowContextMenu触发右键菜单显示

  参数 e:一个event对象,可以通过e.pageX,e.pageY找到鼠标的位置, e.preventDefault取消浏览器默认的右键显示菜单

  在显示菜单前先选中当前行,这样方便之后的操作处理。

 

easyui dategrid 操作示例

标签:des   style   blog   http   io   ar   color   os   使用   

原文地址:http://www.cnblogs.com/eye-like/p/4146731.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!