之前的项目也曾用过JgGrid对它的基本功能也是略有了解,网上有个国外的开源的项目,但是不适合个人的风格,所以花了3天空余的时间封装了下JqGrid,也算是参加开发工作10个月以来写的第一个比较完整的小例子,高手们就直接飘过不用看了,但是由于时间短,还有很多的不足,需要后期再完善。

整体思路就是一个配置类,同时兼容了链式编程的风格,所有的动作接口都以Set开头,便于识别。记录下来以后做个人的使用手册。

源码地址:https://github.com/halower/JqGridForMvc/

推荐写法:

链式编程风格

@(Html.JqGrid("testJqGrid2", new GridConfiguration
(
ColumnFactory.Create("Name","姓名").SetWidth("").SetEditable(ColumnEditType.Textarea).SetSearchable(SearchFiledType.String)
ColumnFactory.Create("Id", "编号").SetWidth("").SetEditable(ColumnEditType.Text).SetSearchable(SearchFiledType.Int)
ColumnFactory.Create("Skin", "肤色").SetWidth("").SetEditable(ColumnEditType.Textarea),
ColumnFactory.Create(null, "操作").SetWidth("").SetFormatter("customerFmatter")
)
)
.SetGroupHeaders(new GroupHeader("Name", , "<font style=\"color:red;\">详细内容</font>"))
.SetCaption("JqGrid测试").SetHeight("")
.SetUrl("/Home/GridData", new Dictionary<string, string> { { "name", "halower" } })
.SetSortName("Name").SetSortOrder(SortOrderType.Desc).SetLoadText("正在加载数据请骚等...")
.SetBuiltInOperation(GridOperatorType.Add | GridOperatorType.Edit | GridOperatorType.Delete | GridOperatorType.Search)
.SetPager("pageId2").SetRowList(new[] { , , , })
.SetSubGridModel(
ColumnFactory.Create("Name", "姓名").SetWidth(""),
ColumnFactory.Create("Language", "中文").SetWidth(""),
ColumnFactory.Create("Country", "国籍").SetWidth("")
)
.SetSubGridUrl("/Home/SubGridData").SetSubGridPostParams(new[] { "Name" })
.SetEditUrl("/Home/EditPerson").SetMultiselect()
)

配置类为主的混搭风格

 @(Html.JqGrid("testJqGrid", new GridConfiguration
{
GridColumns = new List<GridColumn>
{
ColumnFactory.Create("Id", "编号").SetWidth("").SetEditable(ColumnEditType.Text).SetSearchable(SearchFiledType.Int),
new GridColumn{DisplayName ="姓名",Field ="Name",Width ="",Editable = true,Search =true},
new GridColumn{DisplayName ="肤色",Field ="Skin",Width ="",Editable = true,Search =true,SearchFiledType =SearchFiledType.String},
ColumnFactory.Create(null, "操作").SetWidth("").SetFormatter("customerFmatter")
},
Caption = "JqGrid测试",
Height = "",
PagerId = "pageId",
SortName ="Name",
Sortorder = SortOrderType.Desc.ToString().ToLower(),
GridOperation = new GridOperation { Add =true,Delete =true,Edit =true,Search =true},
SetGroupHeaders=true,
ColSPanConfiguation=new ColSPanConfiguation{GroupHeaders =new[]{new GroupHeader("Name", , "<font style=\"color:red;\">详细内容</font>")}},
LoadText = "正在加载数据请骚等...",
RowList =new []{,,},
SubGridModel = new[]
{
new SubGridTable
(
ColumnFactory.Create("Name", "姓名").SetWidth(""),
ColumnFactory.Create("Language", "中文").SetWidth(""),
ColumnFactory.Create("Country", "国籍").SetWidth("")
)
},
Multiselect = true,
EditUrl = "/Home/EditPerson"
})
.SetUrl("/Home/GridData",null)
.SetSubGridUrl("/Home/SubGridData").SetSubGridPostParams(new[] { "Name" })
)

强类型方式

@(
g.JqGrid("testJqGrid").MainGrid(
g.GridColumn(x => x.Id, ),
g.GridColumn(x => x.Name, ),
g.GridColumn(x => x.Skin, ),
g.GridColumn("操作", null, "customerFmatter"))
.Caption("JqGrid测试").Height("")
.Url("/Home/GridData", new Dictionary<string, string> { { "name", "halower" } })
.SortName("Name").SortOrder(SortOrderType.Desc).LoadText("正在加载数据请骚等...")
.Pager("pageId")
.SubGrid(
g.GridColumn(x=>x.Name,),
g.GridColumn(x=>x.Language,),
g.GridColumn(x=>x.Country,)
)
.SubGridUrl("/Home/SubGridData").SubGridPostParams(new[] { "Name" })
)

后台代码实现了排序,查询,分页的全部托管,对增改查也实现了格式限制型的局部托管。

     //主表格
public ContentResult GridData(string name)
{
var list = new List<Person>();
for (var i = ; i < ; i++)
{
list.Add(new Person { Id = i + , Name = "测试" + (i + ), Skin = "Yellow" + i });
}
//支持EF分页排序
//var context=new PersonContext();
//context.Persons.Pagination(this);
       //context.Persons.Pagination(this,p=>p.id>15&&p.id<100);  
return Content(list.Pagination(this));
}
//子表格
public string SubGridData(string name)
{
var list = new List<Chinese>();
for (var i = ; i < ; i++)
{
list.Add(new Chinese { Id = i + , Language = "中文" + i, Name = "子表测试" + (i + ), Country = "中国" + i });
}
return list.PushSubGrid(this);
} //使用原生的Form提交
public JsonResult EditPerson(Person person, string id)
{
if (!ModelState.IsValidField("Id") && !string.IsNullOrEmpty(id))
          //批量删除
//return Json(id.DelegateBuildInOperation(Bussiness.DeleteInfo, this));
return Json(id.DelegateNotBuildInOperation(Bussiness.DeleteInfo));
var optDic = new Dictionary<OperTypes, Func<Person, bool>>
{
{OperTypes.Add, Bussiness.AddPerson},
{OperTypes.Edit, Bussiness.EditPerson},
{OperTypes.Delete, Bussiness.DeletePerson}
};
return Json(person.DelegateBuildInOperation(optDic, this));
} //自定义非原生提交
public JsonResult AddInfo(int id)
{
return Json(id.DelegateNotBuildInOperation(Bussiness.AddInfo));
}

调整下面的位置,自动进行列顺序【包含主表格和子表格】调整

效果如下:

需要什么JS代码,生成什么,其它采用默认配置

<script>$(function(){function _my97datePick(elem){jQuery(elem).datepicker({ dateFormat: 'yy-mm-dd' });};jQuery("#testJqGrid2").jqGrid({"url":"/Home/GridData","datatype":"json","colNames":["编号","姓名","肤色","时间","操作"],"colModel":[{"name":"Id","index":"Id","width":"300","align":"right","sortable":true,"hidden":false,"editable":true,"search":true,"stype":"text","sorttype":"int","edittype":"text","searchoptions":{sopt:['eq','lt','gt']}},{"name":"Name","index":"Name","width":"300","align":"right","sortable":true,"hidden":false,"editable":true,"search":true,"stype":"text","sorttype":"text","edittype":"textarea","searchoptions":{sopt:['eq','bw','cn']}},{"name":"Skin","index":"Skin","width":"300","align":"right","sortable":false,"hidden":false,"editable":true,"search":false,"edittype":"text","searchoptions":{sopt:['eq','bw','cn']}},{"name":"DateTime","index":"DateTime","width":"300","align":"right","sortable":false,"hidden":false,"editable":true,"search":true,"stype":"text","edittype":"text","searchoptions":{dataInit:_my97datePick,attr:{title:'选择日期'},sopt:['eq','lt','gt']}},{"width":"120","align":"right","sortable":false,"hidden":false,"editable":false,"search":false,"formatter":customerFmatter,"searchoptions":{sopt:['eq','bw','cn']}}],"rowNum":10,"rowList":[5,15,33,55],"pager":"#pageId2","sortname":"Name","mtype":"post","viewrecords":true,"ColSPanConfiguation":{"useColSpanStyle":true,"groupHeaders":[{"startColumnName":"Name","numberOfColumns":2,"titleText":"<font style=\"color:red;\">详细内容</font>"}]},"sortorder":"desc","caption":"JqGrid测试","loadtext":"正在加载数据请骚等...","pginput":false,"postData":{"name":"halower","DisplayFileds":"Id,Name,Skin,DateTime","GridKey":"Id"},"autowidth":true,"autoencode":false,"height":"250","multiselect":true,"editurl":"/Home/ChangePersonInfo","subGrid":true,"subGridModel":[{"name":["姓名","中文","国籍"],"width":["150","150","150"],"align":["right","right","right"],"params":["Name"]}],"subGridUrl":"/Home/SubGridData?DisplayFileds=Name,Language,Country","frozen":false});jQuery("#testJqGrid2").jqGrid('navGrid', '#pageId2',{"edit":true,"edittext":"编辑","add":true,"addtext":"添加","del":true,"deltext":"删除","search":true,"searchtext":"查找","refresh":false,"RefreshText":"刷新"},{checkOnSubmit:true,checkOnUpdate:true,closeAfterEdit:true,closeOnEscape:true},{checkOnSubmit:true, closeAfterAdd: true,recreateForm:true},{},{multipleSearch:true});jQuery("#testJqGrid2").jqGrid('setGroupHeaders',{"useColSpanStyle":true,"groupHeaders":[{"startColumnName":"Name","numberOfColumns":2,"titleText":"<font style=\"color:red;\">详细内容</font>"}]});})</script>

为什么要使用链式风格,使用接管代码?

1.采用链式风格主要考虑到JQ的风格,同时可以使代码结构和关联度清晰,同时保留配置类可以也让自己习惯传统风格的人自己配置

2.后台接管代码,主要目的是保持UI层的简洁,轻量级,强制使用者将业务转移到服务层/业务层去处理,防止合作者在Controller里搞一大堆业务代码。

表格接口方法说明

方法名称 参数类型 功能说明
SetGridKey string    设置表格标识列
SetPager string  设置启用分页,并设置分页控件Id
SetUrl string , Dictionary<string, string>  设置获取主表数据的地址
SetCaption string 设置表格名称
SetRowList                           int[]  设置显示下拉记录数
SetSortName string 设置默认的排序列。可以是列名称或者是一个数字,这个参数会被提交到后台
SetDirection DriectionType 设置表格中的书写方向
SetSortOrder SortOrderType 设置 从服务器读取XML或JSON数据时初始的排序类型
SetLoadText string 设置数据请求和排序时显示的文本
SetPgInput  bool  设置导航栏是否有页码输入框
SetAutoWidth  bool   设置自动宽度
SetAutoEencode  bool  设置为true时,对来自服务器的数据和提交数据进行encodes编码。如<![CDATA[<将被转换为&lt;]]>
SetDataType  ResponseDataType  设置表格希望获得的数据的类型
SetEmptyRecords string 设置当返回(或当前)数量为零时显示的信息此项只用当Setviewrecords 设置为true时才有效。
SetHeight string 设置表格高度。可为数值、百分比或auto
SetMultiselect bool 设置此属性设为true时启用多行选择,出现复选框
SetSubGridUrl string  设置子表数据请求Url
SetSubGridPostParams string[] 设置子表获取数据时所依赖父表字段
SetSubGridModel  GridColumn[] 设置子表格列配置
SetBuiltInOperation GridOperatorType 设置启用内置操作类型
SetGroupHeaders GroupHeader[]  设置表头分组
SetEditUrl string 设置内建编辑新增删除操作URL
SetMultipleSearch bool 设置高级搜索

列方法接口说明

方法名称 参数类型 功能说明
SetWidth string    设置列的初始宽度,可用pixels和百分比
SetHidden bool 定义初始化时,列是否隐藏
SetEditable ColumnEditType 定义定义字段是否可编辑
SetSearchable SearchFiledType 定义搜索
SetSearchable              SearchFiledType ,ColumnSearchType   定义搜索
SetSortable ColumnSortType 启用排序
SetFieldName string, string 设置字段映射名
SetFormatter string 自定义Formatter函数
SetUnformat string 自定义Unformat函数,在修改时需要获取原来的值
SetEditoptions string 设置编辑的一系列选项
SetEitrules string  设置编辑的一系列规则
SetFrozen bool 设置冻结列

其中对于自定义的多种验证等规则和选项涉及的参数,尚不是很清楚,Eitrules便暂时使用string作为参数在后面在做配置化处理。虽然很简单,不过快过年了,如果有感兴趣的,觉得还是费点体力的,可以联系halower@foxmail.com

五分钟搭建起一个包含CRUD功能的JqGrid表格的更多相关文章

  1. CRUD功能的JqGrid表格

    CRUD功能的JqGrid表格 之前的项目也曾用过JgGrid对它的基本功能也是略有了解,网上有个国外的开源的项目,但是不适合个人的风格,所以花了3天空余的时间封装了下JqGrid,也算是参加开发工作 ...

  2. 五分钟搭建一个基于BERT的NER模型

    BERT 简介 BERT是2018年google 提出来的预训练的语言模型,并且它打破很多NLP领域的任务记录,其提出在nlp的领域具有重要意义.预训练的(pre-train)的语言模型通过无监督的学 ...

  3. Docker五分钟搭建Wordpress

    当你看到这篇文章的时候,表明你已经有docker的基础知识了,或者可以看上一篇文章 Docker 入门教程. 传统的使用wordpress搭建网站,意味着你需要搭建以下四个环境: php: apach ...

  4. [原]五分钟搭建gitserver

    本来在忙一些事情,结果刚才突然收到一个临时的事情,号称很着急. 问了一下,原来是需要在本地搭建一个git库,但其实之前我是有做过gitserver的,不过是在阿里云(部分分布在青云)上,而且目前在使用 ...

  5. 五分钟搭建博客系统 OK?

    前言: 请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i 概要: 通过 Docker Compose 在使用Docker容器构建的隔离环境中轻松运行 WordPress.在开始之前,请确保已安 ...

  6. 五分钟搭建 Flash 视频直播站

    想在家里对全世界直播网络视频节目吗?如今视频网站是多如牛毛,但能让你玩直播的估计没几个吧?看完这篇教程就能帮你实现网络主持人的梦想.不花钱,不懂编程,不用写代码也行哦~ 首先是最低机器要求:Windo ...

  7. Debian 上面五分钟搭建 WordPress - 博客/网站平台

    没有废话,步骤如下: 下载安装软件,MySQL Apache PHP sudo aptitude install mysql-server mysql-client ##安装 MySQLsudo ap ...

  8. 负载均衡LVS之DR(附:NFS共享存储) 五分钟搭建手册

    一:DR-模式 调度器Ip:192.168.1.254 服务器ip:192.168.1.1/192.168.1.2 VIP:192.168.1.10 ——配置负载均衡调度器: 关闭重定向响应配置: V ...

  9. 五分钟,手撸一个Spring容器!

    大家好,我是老三,Spring是我们最常用的开源框架,经过多年发展,Spring已经发展成枝繁叶茂的大树,让我们难以窥其全貌. 这节,我们回归Spring的本质,五分钟手撸一个Spring容器,揭开S ...

随机推荐

  1. MySql 小记

    MySql  简单 小记 以备查看 1.sql概述 1.什么是sql? 2.sql发展过程? 3.sql标准与方言的关系? 4.常用数据库? 5.MySql数据库安装? 2.关键概念 表结构----- ...

  2. ADO.NET--收藏整理别人的教程

    本文所有内容均从前辈的博客中收集整理而来,仅供自己学习参考的时候快速访问用. ADO.NET入门教程(一) 初识ADO.NET ADO.NET入门教程(二)了解.NET数据提供程序 ADO.NET入门 ...

  3. OpenStack三种类型的NAT转换

    SNAT SNAT即源网络地址转换,这个NAT路由修改IP包包头中的源IP地址.SNAT功能通常用于让只具有私有IP地址的主机能够访问外网,比如,多个PC使用路由器共享上网,每个PC都配置了内网IP, ...

  4. websocket

    websocket是一个协议,在单个TCP连接上提供全双工通信.  websocket被设计并被实现在 web浏览器和 web 服务器上,但是它可以被用于任何c/s 架构的应用程序中. websock ...

  5. [实战]MVC5+EF6+MySql企业网盘实战(29)——更新日志

    摘要 NetDisk更新日志,及项目使用说明. 开发工具 Vs2013+mysql+ef6+mvc5 bug 1.在加载列表的时候,默认加载的所有,修改为,过滤逻辑删除的文件. 2.加载音乐,文档等分 ...

  6. mongodb指南

    一.简介 从官网 https://www.mongodb.com/download-center?jmp=nav#community 下载相应平台及版本的 mongodb,解压后的 bin 文件夹中有 ...

  7. UnityEditor

    1.添加菜单 [MenuItem("Tools/MyTool")] [MenuItem("Tools/MyTool", false, 10)] 优先级控制菜单的 ...

  8. frame和bounds

    - frame 是一个以**父视图**为坐标系的位置- bounds 是一个以**自身**为坐标系的位置- 如果改变了bounds 那么会影响子控件的显示位置

  9. gvim 安装YCM

    gvim的插件安装笔记 1.安装vunble插件 该插件主要用于管理别的插件,借助与git,从github来下载插件,实现自动安装前提条件是git安装正确,可以听过cnd使用,并且可以正确访问gith ...

  10. Java线程的概念

    1.      计算机系统 使用高速缓存来作为内存与处理器之间的缓冲,将运算需要用到的数据复制到缓存中,让计算能快速进行:当运算结束后再从缓存同步回内存之中,这样处理器就无需等待缓慢的内存读写了. 缓 ...