ASP.NET MVC5+EF6+EasyUI 后台管理系统(83)-Easyui Datagrid 行内编辑扩展
系列目录
这次我们要从复杂的交互入手来说明一些用法,这才能让系统做出更加复杂的业务,上一节讲述了Datagird的批量编辑和提交
本节主要演示扩展Datagrid行内编辑的属性,下面来看一个例子,我开启编辑行的时候,右边开启了一个查找图标,点击查找图标可以弹出对应的页面

从API得知,我们进行编辑时候可以使用很多类型:
| editor | string,object | 指明编辑类型。当字符串指明编辑类型的时候,对象包含2个属性: type:字符串,该编辑类型可以使用的类型有:text,textarea,checkbox,numberbox,validatebox,datebox,combobox,combotree。 options:对象,object, 该编辑器属性对应于编辑类型。 |
使用$.fn.datagrid.defaults.editors重载默认值。
每个编辑器都有以下方法:
| 名称 | 属性 | 描述 |
|---|---|---|
| init | container, options | 初始化编辑器并返回目标对象。 |
| destroy | target | 注销编辑器。 |
| getValue | target | 获取编辑框的值。 |
| setValue | target , value | 设置编辑框的值。 |
| resize | target , width | 调整编辑器 |
我们可以重写和补充这些类型的属性,非常之灵活
$.extend($.fn.datagrid.defaults.editors, {
seltext: {
init: function (t, a) {
//设置一个输入框和一个扩大镜图标
var i = $('<input type="text" class="datagrid-editable-input" /> <a href="javascript:SelDetails()" class="fa fa-search color-black"></a>').appendTo(t);
if (a != undefined && a != null && a._medg) {
i.keydown(function (t) {
e(t, a._medg)
})
}
return i
},
destroy: function (e) {
//销毁
$(e).remove()
},
getValue: function (e) {
//datagrid 结束编辑模式,通过该方法返回编辑最终值
return $(e).val()
},
setValue: function (e, t) {
//datagrid 进入编辑器模式,通过该方法为编辑赋值
$(e).val(t);
setTimeout(function () {
e.focus()
},
)
},
resize: function (e, t) {
//列宽改变后调整编辑器宽度
$(e[]).width(t - );
}
}
});
前端调用与原来调用方式一样,只是我们多了一个选择: type: 'seltext' 即可
{ field: 'WareDetailsName', title: 'WareDetailsName', width: ,sortable:true,editor: { type: 'seltext', options: { required: true } },
styler:function(value,row,index){
return 'color:red;';
}
},
有了这个扩展,我们可以对任何类型进行精心定制,比如,日期区间,多文本,上传附件等等

总结:
在加载Easyui.min.js后引入jquery.easyui.plus.js即可
没有特别的复杂用法,其实EasyUI是一个可以扩展很多东西的组件,我们之间还对他扩展过万能查询 http://www.cnblogs.com/ymnets/p/6129139.html下面分享我的一个扩展JS,主要来替代Easyui的不足
1.扩展tree,使其支持平滑数据格式
2.扩展combotree,使其支持平滑数据格式
3.让window居中
4.防止panel/window/dialog组件超出浏览器边界
5. panel关闭时回收内存,主要用于layout使用iframe嵌入网页时的内存泄漏问题
6.datagrid过长显示...截断
/**
* panel关闭时回收内存,主要用于layout使用iframe嵌入网页时的内存泄漏问题
*/
$.fn.panel.defaults.onBeforeDestroy = function () { var frame = $('iframe', this);
try {
// alert('销毁,清理内存');
if (frame.length > ) {
for (var i = ; i < frame.length; i++) {
frame[i].contentWindow.document.write('');
frame[i].contentWindow.close();
}
frame.remove();
if ($.browser.msie) {
CollectGarbage();
}
}
} catch (e) {
}
}; var oriFunc = $.fn.datagrid.defaults.view.onAfterRender;
$.fn.datagrid.defaults.view.onAfterRender = function (tgt) {
if ($(tgt).datagrid("getRows").length > ) { $(tgt).datagrid("getPanel").find("div.datagrid-body").find("div.datagrid-cell").each(function () {
var $Obj = $(this)
$Obj.attr("title", $Obj.text());
})
}
}; var oriFunctree = $.fn.treegrid.defaults.view.onAfterRender;
$.fn.treegrid.defaults.view.onAfterRender = function (tgt) {
if ($(tgt).treegrid("getRoots").length > ) { $(tgt).treegrid("getPanel").find("div.datagrid-body").find("div.datagrid-cell").each(function () {
var $Obj = $(this)
$Obj.attr("title", $Obj.text());
})
}
}; /**
* 防止panel/window/dialog组件超出浏览器边界
* @param left
* @param top
*/ var easyuiPanelOnMove = function (left, top) {
var l = left;
var t = top;
if (l < ) {
l = ;
}
if (t < ) {
t = ;
}
var width = parseInt($(this).parent().css('width')) + ;
var height = parseInt($(this).parent().css('height')) + ;
var right = l + width;
var buttom = t + height;
var browserWidth = $(window).width();
var browserHeight = $(window).height();
if (right > browserWidth) {
l = browserWidth - width;
}
if (buttom > browserHeight) {
t = browserHeight - height;
}
$(this).parent().css({/* 修正面板位置 */
left: l,
top: t
});
};
//$.fn.dialog.defaults.onMove = easyuiPanelOnMove;
//$.fn.window.defaults.onMove = easyuiPanelOnMove;
//$.fn.panel.defaults.onMove = easyuiPanelOnMove;
//让window居中
var easyuiPanelOnOpen = function (left, top) { var iframeWidth = $(this).parent().parent().width(); var iframeHeight = $(this).parent().parent().height(); var windowWidth = $(this).parent().width();
var windowHeight = $(this).parent().height(); var setWidth = (iframeWidth - windowWidth) / ;
var setHeight = (iframeHeight - windowHeight) / ;
$(this).parent().css({/* 修正面板位置 */
left: setWidth,
top: setHeight
}); if (iframeHeight < windowHeight) {
$(this).parent().css({/* 修正面板位置 */
left: setWidth,
top:
});
}
$(".window-shadow").hide();
//修复被撑大的问题
if ($(".window-mask") != null) {
if ($(".window-mask").size() > ) {
$(".window-mask")[].remove();
}
}
$(".window-mask").attr("style", "display: block; z-index: 9002; width: " + iframeWidth - + "px; height: " + iframeHeight - + "px;"); //$(".window-mask").hide().width(1).height(3000).show();
};
$.fn.window.defaults.onOpen = easyuiPanelOnOpen;
var easyuiPanelOnClose = function (left, top) { $(".window-mask").hide(); //$(".window-mask").hide().width(1).height(3000).show();
}; $.fn.window.defaults.onClose = easyuiPanelOnClose; /**
*
* @requires jQuery,EasyUI
*
* 扩展tree,使其支持平滑数据格式
*/
$.fn.tree.defaults.loadFilter = function (data, parent) {
var opt = $(this).data().tree.options;
var idFiled, textFiled, parentField;
//alert(opt.parentField);
if (opt.parentField) {
idFiled = opt.idFiled || 'id';
textFiled = opt.textFiled || 'text';
parentField = opt.parentField;
var i, l, treeData = [], tmpMap = [];
for (i = , l = data.length; i < l; i++) {
tmpMap[data[i][idFiled]] = data[i];
}
for (i = , l = data.length; i < l; i++) {
if (tmpMap[data[i][parentField]] && data[i][idFiled] != data[i][parentField]) {
if (!tmpMap[data[i][parentField]]['children'])
tmpMap[data[i][parentField]]['children'] = [];
data[i]['text'] = data[i][textFiled];
tmpMap[data[i][parentField]]['children'].push(data[i]);
} else {
data[i]['text'] = data[i][textFiled];
treeData.push(data[i]);
}
}
return treeData;
}
return data;
}; /** * @requires jQuery,EasyUI
*
* 扩展combotree,使其支持平滑数据格式
*/
$.fn.combotree.defaults.loadFilter = $.fn.tree.defaults.loadFilter; //如果datagrid过长显示...截断(格式化时候,然后调用resize事件)
//$.DataGridWrapTitleFormatter("值",$("#List"),"字段");
//onResizeColumn:function(field,width){ var refreshFieldList = ["字段名称","字段名称","字段名称"]; if(refreshFieldList.indexOf(field)>=0){$("#List").datagrid("reload");})}
$.extend({
DataGridWrapTitleFormatter: function (value, obj, fidld) {
if (value == undefined || value == null || value == "") {
return "";
}
var options = obj.datagrid('getColumnOption', field);
var cellWidth = ;
if (options != undefined) {
cellWidth = options.width - ;
}
return "<div style='width:" + cellWidth + "px;padding:0px 6px;line-height:25px;height:25px;margin-top:1px;cursor:pointer;white-space:nowrap:overflow:hidden;text-overflow:ellipsis;' title='" + value + "'>" + value + "</div>";
}
});
//替换字符串
/*
* 功 能:替换字符串中某些字符
* 参 数:sInput-原始字符串 sChar-要被替换的子串 sReplaceChar-被替换的新串
* 返 回 值:被替换后的字符串
*/
$.extend({
ReplaceStrAll: function (sInput, sChar, sReplaceChar) {
if (sInput == "" || sInput == undefined) {
return "";
}
var oReg = new RegExp(sChar, "g");
return sInput.replace(oReg, sReplaceChar); }
}); /*
* 功 能:替换字符串中某些字符(只能是第一个被替换掉)
* 参 数:sInput-原始字符串 sChar-要被替换的子串 sReplaceChar-被替换的新串
* 返 回 值:被替换后的字符串
*/
$.extend({
ReplaceOne: function (sInput, sChar, sReplaceChar) {
if (sInput == "" || sInput == undefined) {
return "";
}
return sInput.replace(sChar, sReplaceChar);
}
}); //合并列
//onLoadSuccess: function (data) {
// $(this).datagrid("autoMergeCells", ['Area', 'PosCode']);
//},
$.extend($.fn.datagrid.methods, {
autoMergeCells: function (jq, fields) {
return jq.each(function () {
var target = $(this);
if (!fields) {
fields = target.datagrid("getColumnFields");
}
var rows = target.datagrid("getRows");
var i = ,
j = ,
temp = {};
for (i; i < rows.length; i++) {
var row = rows[i];
j = ;
for (j; j < fields.length; j++) {
var field = fields[j];
var tf = temp[field];
if (!tf) {
tf = temp[field] = {};
tf[row[field]] = [i];
} else {
var tfv = tf[row[field]];
if (tfv) {
tfv.push(i);
} else {
tfv = tf[row[field]] = [i];
}
}
}
}
$.each(temp, function (field, colunm) {
$.each(colunm, function () {
var group = this; if (group.length > ) {
var before,
after,
megerIndex = group[];
for (var i = ; i < group.length; i++) {
before = group[i];
after = group[i + ];
if (after && (after - before) == ) {
continue;
}
var rowspan = before - megerIndex + ;
if (rowspan > ) {
target.datagrid('mergeCells', {
index: megerIndex,
field: field,
rowspan: rowspan
});
}
if (after && (after - before) != ) {
megerIndex = after;
}
}
}
});
});
});
}
}); $.extend($.fn.datagrid.defaults.editors, {
text: {
init: function (t, a) {
var i = $('<input type="text" class="datagrid-editable-input" />').appendTo(t);
if (a != undefined && a != null && a._medg) {
i.keydown(function (t) {
e(t, a._medg)
})
}
return i
},
destroy: function (e) {
$(e).remove()
},
getValue: function (e) {
return $(e).val()
},
setValue: function (e, t) {
$(e).val(t);
setTimeout(function () {
e.focus()
},
)
},
resize: function (e, t) {
$(e[]).width(t - );
}
},
seltext: {
init: function (t, a) {
//设置一个输入框和一个扩大镜图标
var i = $('<input type="text" class="datagrid-editable-input" /> <a href="javascript:SelDetails()" class="fa fa-search color-black"></a>').appendTo(t);
if (a != undefined && a != null && a._medg) {
i.keydown(function (t) {
e(t, a._medg)
})
}
return i
},
destroy: function (e) {
//销毁
$(e).remove()
},
getValue: function (e) {
//datagrid 结束编辑模式,通过该方法返回编辑最终值
return $(e).val()
},
setValue: function (e, t) {
//datagrid 进入编辑器模式,通过该方法为编辑赋值
$(e).val(t);
setTimeout(function () {
e.focus()
},
)
},
resize: function (e, t) {
//列宽改变后调整编辑器宽度
$(e[]).width(t - );
}
},
textarea: {
init: function (t, a) {
var i = $('<textarea class="datagrid-editable-input"></textarea>').appendTo(t);
if (a != undefined && a != null && a._medg) {
i.keydown(function (t) {
e(t, a._medg)
})
}
return i
},
destroy: function (e) {
$(e).remove()
},
getValue: function (e) {
return $(e).val()
},
setValue: function (e, t) {
$(e).val(t);
setTimeout(function () {
e.focus()
},
)
},
resize: function (e, t) {
e.outerWidth(t);
e.outerHeight(e.parents("td[field]").height())
}
},
checkbox: {//调用名称
init: function (container, options) {
//container 用于装载编辑器 options,提供编辑器初始参数
var input = $('<input type="checkbox" class="datagrid-editable-input">').appendTo(container);
//这里我把一个 checkbox类型的输入控件添加到容器container中
// 需要渲染成easyu提供的控件,需要时用传入options,我这里如果需要一个combobox,就可以 这样调用 input.combobox(options);
return input;
},
getValue: function (target) {
//datagrid 结束编辑模式,通过该方法返回编辑最终值
//这里如果用户勾选中checkbox返回1否则返回0
return $(target).prop("checked") ? : ;
},
setValue: function (target, value) {
//datagrid 进入编辑器模式,通过该方法为编辑赋值
//我传入value 为0或者1,若用户传入1则勾选编辑器
if (value)
$(target).prop("checked", "checked")
},
resize: function (target, width) {
//列宽改变后调整编辑器宽度
var input = $(target);
if ($.boxModel == true) {
input.width(width - (input.outerWidth() - input.width()));
} else {
input.width(width);
}
}
} }); function ccc(o) {
console.log(o);
}jquery.easyui.plus.js
ASP.NET MVC5+EF6+EasyUI 后台管理系统(83)-Easyui Datagrid 行内编辑扩展的更多相关文章
- Django项目:CRM(客户关系管理系统)--69--59PerfectCRM实现king_admin行内编辑
#base_admin.py # ————————24PerfectCRM实现King_admin自定义操作数据———————— from django.shortcuts import render ...
- easyui datagrid行内编辑
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(1)-前言与目录(转)
开发工具:VS2015(2012以上)+SQL2008R2以上数据库 您可以有偿获取一份最新源码联系QQ:729994997 价格 666RMB 升级后界面效果如下: 日程管理 http://ww ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(1)-前言与目录(持续更新中...)
开发工具:VS2015(2012以上)+SQL2008R2以上数据库 您可以有偿获取一份最新源码联系QQ:729994997 价格 666RMB 升级后界面效果如下: 任务调度系统界面 http: ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(63)-Excel导入和导出-自定义表模导入
系列目录 前言 上一节使用了LinqToExcel和CloseXML对Excel表进行导入和导出的简单操作,大家可以跳转到上一节查看: ASP.NET MVC5+EF6+EasyUI 后台管理系统(6 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(51)-系统升级
系统很久没有更新内容了,期待已久的更新在今天发布了,最近花了2个月的时间每天一点点,从原有系统 MVC4+EF5+UNITY2.X+Quartz 2.0+easyui 1.3.4无缝接入 MVC5+E ...
- 构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统
开篇:从50开始系统已经由MVC4+EF5+UNITY2.X+Quartz 2.0+easyui 1.3.4无缝接入 MVC5+EF6+Unity4.x+Quartz 2.3 +easyui 1.4. ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统-WebApi的用法与调试
1:ASP.NET MVC5+EF6+EasyUI 后台管理系统(1)-WebApi与Unity注入 使用Unity是为了使用我们后台的BLL和DAL层 2:ASP.NET MVC5+EF6+Easy ...
- 构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统(66)-MVC WebApi 用户验证 (2)
前言: 构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统(65)-MVC WebApi 用户验证 (1) 回顾上一节,我们利用webapi简单的登录并 ...
随机推荐
- SaaS模式应用之多租户系统开发(单数据库多Schema设计)
SaaS是Software-as-a-Service(软件即服务)的简称,这边具体的解释不介绍. 多租户的系统可以应用这种模式的思想,将思想融入到系统的设计之中. 一.多租户的系统,目前在数据库存储上 ...
- 获取JVM的dump文件
获取JVM的dump文件的两种方式 1. JVM启动时增加两个参数: #出现 OOME 时生成堆 dump: -XX:+HeapDumpOnOutOfMemoryError #生成堆文件地址: -XX ...
- vue简易轮播图
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 【Yii系列】处理请求
缘起 这一章是Yii系列的第三章,前两章给大伙讲解了Yii2.0的安装与Yii2.0的基本框架及基础概念,传送门: [Yii2.0的安装与调试]:http://www.cnblogs.com/rive ...
- 【canvas系列】canvas实现"雷达扫描"效果
今天来讲解"雷达扫描"效果demo,来源于QQ群里边有群友说想要个雷达效果,就尝试写了一下. 效果图: demo链接: https://win7killer.github.io/c ...
- [SinGuLaRiTy] 数论基础
[SinGuLaRiTy-1004] Copyright (c) SinGuLaRiTy 2017 . All Rights Reserved. 整除: 设a,b为整数,且a不为0,如果存在一个整数q ...
- 老李推荐:第5章1节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 官方简介
老李推荐:第5章1节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 官方简介 在MonkeyRunner的框架中,Monkey是作为一个服务来接受来自Monkey ...
- day001-html知识点总结(-)块级。行内元素区分
-.行内元素和块级元素的区别与转换: 区别: 1.从形式上看,在标准文档流中,行内元素会水平方向呈线性排列,而块级元素会各占一行,垂着方向排列. 2.在结构使用上,块级元素可以包含行内元素和块级元素, ...
- 【割点】【割边】tarjan
洛谷割点模板题--传送门 割边:在连通图中,删除了连通图的某条边后,图不再连通.这样的边被称为割边,也叫做桥.割点:在连通图中,删除了连通图的某个点以及与这个点相连的边后,图不再连通.这样的点被称为割 ...
- selenium结合docker构建分布式测试环境
selenium是目前web和app自动化测试的主要框架.对于web自动化测试而言,由于selenium2.0以后socker服务器由本地浏览器自己启动且直接通过浏览器原生API操作页面,故越来越多的 ...