要实现 EasyUI DataGrid 的可编辑很简单,在需要编辑的列添加 editor 【编辑器】就可以了。


  • 单行编辑
// 初始化数据列表
function initDatagrid() {
$('#dg').datagrid({
loadMsg: '数据加载中请稍后……',
striped: true,
url: '/api/Employee',
method: "get",
striped: true,
border: true,
selectOnCheck: false,
checkOnSelect: false,
remoteSort: true,
singleSelect: true, // 只允许选中一行
idField: 'EmployeeID',
pagination: true,
rownumbers: false,
fitColumns: true,
pageSize: 100, // 每页显示的记录条数,默认为100
pageList: [20, 50, 100, 200, 500], // 设置可选的每页记录条数的列表
columns: [[
{ field: 'ck', checkbox: true },
{ field: 'Num', title: "编号", width: 30, sortable: false },
{
field: 'Name', title: "姓名", width: 80, sortable: true,
editor: {
type: 'validatebox',
options: { required: true, missingMessage: '请输入姓名' }
}
},
{
field: 'Sex', title: "性别", width: 50, sortable: true,
formatter: formatSex,
// 编辑器
editor: {
type: 'combobox', // 指明控件类型
// options里面的内容可选
options: {
textField: 'sex',
valueField: 'value',
data: [
{
sex: '男',
value: 0
},
{
sex: '女',
value: 1
}
],
required: true, // 是否必填
missingMessage: '请选择性别'
}
}
}
...
]],
// 工具栏
toolbar: [
{
text: "新增",
iconCls: "icon-add",
handler: function () {
if (isEditing == true) {
$.messager.alert('操作提示', '您有正在编辑的数据尚未保存,请先保存或取消编辑!', 'warning');
}
else {
// 在第一行编辑新增数据
$('#dg').datagrid('insertRow', {
index: 0,
row: {
Name: '',
Sex: '',
EntryDate: '',
LeaveDate: '',
OMPDate: ''
}
});
$("#dg").datagrid("beginEdit", 0);
isEditing = true;
editRow = 0; isEdit = false;
}
}
},
{
text: "编辑",
iconCls: "icon-edit",
handler: function () {
var row = $('#dg').datagrid('getSelected');
var rowIndex = $('#dg').datagrid('getRowIndex', row);
if (isEditing == true && rowIndex != editRow) {
$.messager.alert('操作提示', '您有正在编辑的数据尚未保存,请先保存或取消编辑!', 'warning');
} else if (rowIndex > -1) {
$('#dg').datagrid("beginEdit", rowIndex);
isEditing = true;
editRow = rowIndex;
} else {
$.messager.alert('操作提示', '请先选择要编辑的行!', 'info');
} isEdit = true;
}
},
{
text: "保存",
iconCls: "icon-save",
handler: function () {
$('#dg').datagrid("endEdit", editRow);
}
},
{
text: "取消",
iconCls: "icon-cancel",
handler: function () {
$('#dg').datagrid("cancelEdit", editRow);
isEditing = false;
$('#dg').datagrid("reload");
}
}
],
onBeforeLoad: function (params) {
// 添加参数
params.name = $("#queryName").val();
params.year = $("#queryYear").numberbox("getValue");
params.month = $("#queryMonth").numberbox("getValue");
},
// 完成编辑时发送请求保存数据到后台
onAfterEdit: function (rowIndex, rowData, changes) {
$(this).datagrid("beginEdit", rowIndex); // 这句如果注释掉下一行的ed就获取不到值
var ed = $(this).datagrid('getEditor', { index: rowIndex, field: 'Sex' });
var sex = ed.target.combobox('getValue');
editRow = rowIndex;
isEditing = false;
Employee.save(rowData, sex);
}
});
}

Note: datagridgetEditor 方法要在那一行是编辑状态下才能获取到编辑器,所以要先调用 beginEdit 方法开启行编辑状态。
比如上面的代码 onAfterEdit 函数里面如果 $(this).datagrid("beginEdit", rowIndex); 这句注释掉了,下一行的使用 getEditor 就获取不到值,ed 得到的是 null


  • 多行编辑

多行编辑的时候可以一次提交大量数据到后台,是使用表单的方式提交的。后台获取到的数据也需要进行处理,因此这里也贴一下后台代码吧。

前端代码:

    // 初始化数据列表
function initDatagrid() {
$('#dg').datagrid({
loadMsg: '数据加载中请稍后……',
striped: true,
url: '/api/Attendance',
sortName: 'ID',
sortOrder: 'desc',
method: "get",
striped: true,
border: true,
selectOnCheck: false,
checkOnSelect: false,
remoteSort: true,
singleSelect: true,
idField: 'ID',
pagination: true,
rownumbers: false,
pageSize: 100, // 每页显示的记录条数,默认为100
pageList: [20, 50, 100, 200, 500], // 设置可选的每页记录条数的列表
fitColumns: true,
columns: [[
{
field: 'Num', title: "编号", width: 34, sortable: false
},
{
field: 'Employee', title: "人员", width: 64, sortable: true
},
{
field: 'Extra', title: "加班<br>(天)", width: 50, sortable: true,
// 只有添加了editor的列才是可编辑的
editor: {
type: 'numberbox',
options: {
precision: 3,
onChange: function () {
var rowIndex = getRowIndex(this);
updateEstimatedDays(rowIndex);
}
}
}
},
{
field: 'UnpaidVacate', title: "请假<br>(天)", width: 50, sortable: true,
editor: {
type: 'numberbox',
options: {
precision: 3,
onChange: function () {
var rowIndex = getRowIndex(this);
updateEstimatedDays(rowIndex);
}
}
}
},
// 此处省略部分列...
{
field: 'Year', title: "年份", width: 37, sortable: false
},
{
field: 'Month', title: "月份", width: 34, sortable: false
},
{
field: 'Remark', title: "备注", width: 260, sortable: false,
editor: {
type: 'textbox'
}
}
]],
// 添加工具栏
toolbar: [
{
text: "生成基础数据",
iconCls: "icon-add", // 定义图标样式
handler: function () {
var year = $('#queryYear').numberbox('getValue');
var month = $('#queryMonth').numberbox('getValue');
$.get('/api/Attendance?year=' + year + '&month=' + month, function (data) {
if (!data.State) {
$.messager.alert('警告', data.Data, 'info');
} else {
$('#dg').datagrid('reload');
}
});
}
},
{
text: "保存",
iconCls: "icon-save",
// 批量提交多条已修改数据到后台
handler: function () {
// 关闭最后一个当前编辑行,否则最后一行的数据不会被getChanges方法捕获到
$('#dg').datagrid('endEdit', editRow); // 修改过的行突出显示
if (editRow > 0) {
var element = document.getElementById("datagrid-row-r1-2-" + editRow);
element.style.backgroundColor = "#d6e486";
} // 如果有数据修改过才进行提交
if ($('#dg').datagrid('getChanges').length) { // 获取已修改的数据
var updated = $('#dg').datagrid('getChanges', "updated");
var effectRow = new Object();
if (updated.length) {
effectRow["updated"] = JSON.stringify(updated);
} // 后台处理数据时先显示一个提示框,防止用户多次点击【保存】重复提交数据
$.messager.progress({
title: '提示',
msg: '正在保存,请稍候……',
}); var year = parseInt($('#queryYear').numberbox('getValue'));
var month = parseInt($('#queryMonth').numberbox('getValue')); $.ajax({
type: "put",
dataType: "json",
data: effectRow,
url: "/api/Attendance?year=" + year + "&month=" + month,
success: function (data) {
if (!data.State) {
$.messager.alert('警告', data.Data, 'info');
} else {
$('#dg').datagrid('reload');
editRow = -1;
} $.messager.progress('close');
$('#dg').datagrid('unselectAll');
},
error: function () {
$.messager.alert('警告', data.Data, 'info');
$.messager.progress('close');
$('#dg').datagrid('unselectAll');
}
});
}
}
},
{
text: "取消",
iconCls: "icon-cancel",
handler: function () {
endEdit(editRows);
$('#dg').datagrid('reload');
$('#dg').datagrid('unselectAll');
editRow = -1;
}
}
],
onBeforeLoad: function (params) {
params.employeeID = $("#queryEmployee").combobox("getValue");
params.year = $("input[name='queryYear']").val() != "" ? $("input[name='queryYear']").val() : -1;
params.month = $("input[name='queryMonth']").val() != "" ? $("input[name='queryMonth']").val() : -1;
params.sortField = sortField;
params.sortOrder = sortOrder;
},
// 鼠标单击某一行是开启该行的编辑状态
onClickRow: function (rowIndex, rowData) {
if (canEdit == true) {
$('#dg').datagrid('endEdit', editRow);
if (rowIndex > 0) {
$('#dg').datagrid("beginEdit", rowIndex);
}
// 修改过的行突出显示
if (editRow > 0) {
var element = document.getElementById("datagrid-row-r1-2-" + editRow);
element.style.backgroundColor = "#d6e486";
} editRows.push(rowIndex);
editRow = rowIndex;
}
}
});
}

PS:既然是多行输入,肯定是想一次性连续编辑多行再提交数据了,那就意味着要一次性开启多行的编辑状态。但是我发现当行较多时一次性打开全部行的编辑状态会很慢,导致页面卡一下,一次性关闭全部编辑状态同理也是。这个问题没有找到很好的解决办法。于是我改成了鼠标单击某一行的时候就开启该行的编辑状态,再点击其他行时就关闭上次点击行,然后开启新点击的行。这样不至于让页面变慢,而且输入方式也还能接受吧。
当然大家有更好的解决方法欢迎留言哈~~

后台代码【C#】

/// <summary>
/// 批量修改考勤数据
/// </summary>
/// <returns></returns>
public ResponseModel Put(int year, int month)
{
ResponseModel result = new ResponseModel(); try
{
// 从表单获取提交的数据
string updated = System.Web.HttpContext.Current.Request.Form["updated"];
// 反序列化json对象
JavaScriptSerializer jsSerializer = new JavaScriptSerializer();
List<Attendance> attendanceList = jsSerializer.Deserialize<List<Attendance>>(updated);
if (attendanceList.Count > 0)
{
if (m_AttendanceBLL.Update(attendanceList, year, month)
{
result.State = ResponseModel.ResponseState.Success;
result.Data = true;
}
else
{
result.Data = "修改考勤数据失败";
}
}
}
catch (Exception ex)
{
result.Data = "修改考勤数据失败";
LogHelper.WriteLog(m_ModelName + "修改考勤数据失败:" + ex.Message, ex);
} return result;
}

Tips:一个获取当前编辑行索引的方法

// 扩展easyui datagrid方法,获取当前编辑行的索引
// target: 当前编辑元素
function getRowIndex(target) {
var tr = $(target).closest("tr.datagrid-row"); return parseInt(tr.attr("datagrid-row-index"));
}

参考文章:easyui datagrid 批量编辑和提交

EasyUI DataGrid 实现单行/多行编辑功能的更多相关文章

  1. jquery-easyui 中表格的行编辑功能

    具体实现代码如下: <table id="tt"></table> $('#tt').datagrid({ title:'Editable DataGrid ...

  2. jquery easyui datagrid 获取Checked选择行(勾选行)数据

    原文:jquery easyui datagrid 获取Checked选择行(勾选行)数据 getSelected:取得第一个选中行数据,如果没有选中行,则返回 null,否则返回记录. getSel ...

  3. easyui datagrid 行编辑功能

    datagrid现在具有行编辑能力了,使用时只须在columns中为需要编辑的列添加一个editor属性,编辑保存时同时具有数据校验能力. 看一个例子效果图: 代码如下: $('#tt').datag ...

  4. EasyUi DataGrid中数据编辑方式及编辑后数据获取,校验处理

    EasyUi中的DataGrid提供前台编辑的相关函数. 实现客户选中DataGrid中一列后,对选中列中的一个字段进行编辑,并对数据进行实时校验后,传递至后台保存的需求, 主要涉及到DataGrid ...

  5. jquery-easyui中表格的行编辑功能

    datagrid现在具有行编辑能力了,使用时只须在columns中为需要编辑的列添加一个editor属性,编辑保存时同时具有数据校验能力. 看一个例子效果图: 代码如下: $('#tt').datag ...

  6. easyui datagrid取消点击行的选中事件

    http://www.jeasyui.com/demo/main/index.php?plugin=DataGrid&theme=material&dir=ltr&pitem= ...

  7. jquery easyui datagrid实现单行的上移下移,以及保存移动的结果

    1.实现行的上移.下移. 说明: 1.1 通过datagrid生成的表格有固定的格式,比如,表格div的class名是datagrid-view.比如每一行tr都有id和datagrid-row-in ...

  8. jQuery easyUI datagrid 增加求和统计行 分类: JavaScript 2015-01-14 17:46 2178人阅读 评论(0) 收藏

    在datagrid的onLoadSuccess事件增加代码处理. <style type="text/css"> .subtotal { font-weight: bo ...

  9. 扩展jQuery easyui datagrid增加动态改变列编辑的类型

    $.extend($.fn.datagrid.methods, { addEditor : function(jq, param) { if (param instanceof Array) { $. ...

随机推荐

  1. 谷歌chrome 插件(扩展)开发——谈谈安装

    chrome extension  安装的方式简单,打包方式也是非常简单的. 官方给出了三种安装方式: Chrome Web Store:把你的扩展程序上传到Chrome  Web Store, &q ...

  2. Several ports (8005, 8080, 8009)被占用

    启动Tomcat服务器报错: Several ports (8005, 8080, 8009) required by Tomcat v5.5 Server at localhost are alre ...

  3. Micropython TurnipBit 青少年入门编程 交通灯实验

    不知道大家小时候对红绿灯的原理有什么研究过,我是农村的孩子直到初中才见到真实的红绿灯,当时我记得很清楚,在那个路口站了五六分钟就盯着红绿灯变换,搞不清原理,只觉得神奇.现在想来实在可笑,今天写这个的很 ...

  4. 云计算之路-阿里云上:docker swarm 问题最新进展

    今天中午我们在 docker swarm 集群上发布应用时遇到了一个奇怪的 docker swarm 内置负载均衡的问题,该应用的 2 个新容器成功启动后,在容器内访问正常,但通过服务名访问时一会正常 ...

  5. NOIP2017 总结

    联赛结束,但是我并没有得到预期的结果,特写此文分析原因,希望我不会就此退役. 回顾一年,我做了什么? 2016年联赛,我水了两天,抱着挂掉的心态拿到了1=. 2016-2017寒假,参加集训,三天考试 ...

  6. Python基础-week04

    本节内容摘要:#Author:http://www.cnblogs.com/Jame-mei 装饰器 迭代器&生成器 Json & pickle 数据序列化 软件目录结构规范 作业:A ...

  7. 从分布式一致性到共识机制(一)Paxos算法

    从分布式系统的CAP理论出发,关注分布式一致性,以及区块链的共识问题及解决. 区块链首先是一个大规模分布式系统,共识问题本质就是分布式系统的一致性问题,但是又有很大的不同.工程开发中,认为系统中存在故 ...

  8. [poj1094]Sorting It All Out_拓扑排序

    Sorting It All Out poj-1094 题目大意:给出一些字符串之间的大小关系,问能否得到一个唯一的字符串序列,满足权值随下标递增. 注释:最多26个字母,均为大写. 想法:显然,很容 ...

  9. hihocoder [Offer收割]编程练习赛52 D 部门聚会

    看了题目的讨论才会做的 首先一点,算每条边(u, v)对于n*(n+1)/2种[l, r]组合的贡献 正着算不如反着算 哪些[l, r]的组合没有包含这条边(u, v)呢 这个很好算 只需要统计u这半 ...

  10. 从源码来看ReentrantLock和ReentrantReadWriteLock

    上一篇花了点时间将同步器看了一下,心中对锁的概念更加明确了一点,知道我们所使用到的锁是怎么样获取同步状态的,我们也写了一个自定义同步组件Mutex,讲到了它其实就是一个简版的ReentrantLock ...