五分钟搭建起一个包含CRUD功能的JqGrid表格

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

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

链式编程风格

@(Html.JqGrid("testJqGrid2", new GridConfiguration
          (
            ColumnFactory.Create("Name","姓名").SetWidth("300").SetEditable(ColumnEditType.Textarea).SetSearchable(SearchFiledType.String)
            ColumnFactory.Create("Id", "编号").SetWidth("300").SetEditable(ColumnEditType.Text).SetSearchable(SearchFiledType.Int)
            ColumnFactory.Create("Skin", "肤色").SetWidth("300").SetEditable(ColumnEditType.Textarea),
            ColumnFactory.Create(null, "操作").SetWidth("100").SetFormatter("customerFmatter")
          )
      )
      .SetGroupHeaders(new GroupHeader("Name", 2, "<font style=\"color:red;\">详细内容</font>"))
      .SetCaption("JqGrid测试").SetHeight("250")
      .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[] { 5, 15, 33,55 })
      .SetSubGridModel(
          ColumnFactory.Create("Name", "姓名").SetWidth("150"),
          ColumnFactory.Create("Language", "中文").SetWidth("150"),
          ColumnFactory.Create("Country", "国籍").SetWidth("150")
      )
      .SetSubGridUrl("/Home/SubGridData").SetSubGridPostParams(new[] { "Name" })
          .SetEditUrl("/Home/EditPerson").SetMultiselect()
      )

配置类为主的混搭风格

 1 @(Html.JqGrid("testJqGrid", new GridConfiguration
 2   {
 3       GridColumns = new List<GridColumn>
 4       {
 5            ColumnFactory.Create("Id", "编号").SetWidth("300").SetEditable(ColumnEditType.Text).SetSearchable(SearchFiledType.Int),
 6            new GridColumn{DisplayName ="姓名",Field ="Name",Width ="300",Editable = true,Search =true},
 7            new GridColumn{DisplayName ="肤色",Field ="Skin",Width ="300",Editable = true,Search =true,SearchFiledType =SearchFiledType.String},
 8            ColumnFactory.Create(null, "操作").SetWidth("100").SetFormatter("customerFmatter")
 9       },
10       Caption = "JqGrid测试",
11       Height = "250",
12       PagerId = "pageId",
13       SortName ="Name",
14       Sortorder = SortOrderType.Desc.ToString().ToLower(),
15       GridOperation = new GridOperation { Add =true,Delete =true,Edit =true,Search =true},
16       SetGroupHeaders=true,
17       ColSPanConfiguation=new ColSPanConfiguation{GroupHeaders =new[]{new GroupHeader("Name", 2, "<font style=\"color:red;\">详细内容</font>")}},
18       LoadText = "正在加载数据请骚等...",
19       RowList =new []{11,15,20},
20       SubGridModel = new[]
21       {
22             new SubGridTable
23             (
24              ColumnFactory.Create("Name", "姓名").SetWidth("150"),
25              ColumnFactory.Create("Language", "中文").SetWidth("150"),
26              ColumnFactory.Create("Country", "国籍").SetWidth("150")
27             )
28        },
29        Multiselect = true,
30        EditUrl = "/Home/EditPerson"
31       })
32       .SetUrl("/Home/GridData",null)
33       .SetSubGridUrl("/Home/SubGridData").SetSubGridPostParams(new[] { "Name" })
34 )

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

     //主表格
        public ContentResult GridData(string name)
        {
            var list = new List<Person>();
            for (var i = 0; i < 300000; i++)
            {
                list.Add(new Person { Id = i + 1, Name = "测试" + (i + 1), 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 = 0; i < 5; i++)
            {
                list.Add(new Chinese { Id = i + 1, Language = "中文" + i, Name = "子表测试" + (i + 1), 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));
        }

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

效果如下:

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

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

2.后台接管代码,主要目的是保持UI层的简洁,保持UI层的轻量级,强制使用者将业务转移到服务层去处理。

表格接口方法说明

方法名称 参数类型 功能说明
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  设置编辑的一系列规则
Frozen bool 设置冻结列

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

时间: 2024-11-01 01:22:40

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

《AWS云计算实战》2.五分钟搭建 WordPress 站点

本文内容:使用 AWS CloudFormation 实现基础设施的自动化部署. WordPress 基础设施架构 需要使用4个不同的 AWS 服务实现 WordPress 站点项目: 弹性负载均衡(Elastic Load Balancing,ELB)--AWS 提供的弹性负载均衡服务.负载均衡器用于将流量分发到 Web 服务器. 弹性计算云(Elastic Computer Cloud,EC2)--EC2 服务提供的虚拟服务器. 如果 EC2 的 CPU 利用率高于 80%,应该添加第三台服

五分钟搭建App设置页面

原文出处: 陈燕翔(@燕翔de专注)   欢迎分享原创到伯乐头条 本节主题(Storyboard/模型思想搭建设置页面) 设置(Setting)页面的搭建(实现效果) 开发方式(这里提供两种,个人感觉第二种重用性较高,推荐使用.但第一种较为简单,视开发需求选择) (1)纯代码 + StoryBoard混合 开发 (2)纯代码 + 模型 思想 设置页面的搭建 假设你已经搭建出了这个基本框架<十分钟搭建App主流框架>但这毕竟是个空壳,下面让我们把设置页面简单的搭建一下吧 注:本文仅仅提供简略的搭

五分钟开发好你的第一个人工智能应用

关于人工智能,有几个常被问到的问题: Q:人工智能开发前景好不好? A:据IDC(互联网数据中心)预测,到2020年,全球人工智能收入将超过460亿美元.与传统行业相比,人工智能增长速度非常迅猛. 2018年年初,教育部也将人工智能相关内容纳入高中新课标,并启动了人工智能+教师队伍建设行动计划. Q:人工智能开发好学吗? A:只要是能学的东西都是相对简单的,人工智能不难,难的是"开发"两个字! 今天为大家介绍如何快速地构建一个人工智能识图程序--任意丢张图片给它,程序可以告诉我们图片内

五分钟一个设计模式之适配器模式

五分钟一个设计模式,用最简单的方法来描述设计模式.查看更多设计模式,请点击五分钟一个设计模式系列 http://blog.csdn.net/daguanjia11/article/category/3259443 认识适配器模式 适配器模式的定义是:将一个类的接口转换成客户端希望的另外一个接口.适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 适配器模式的主要功能是转换接口,目的是复用已有功能,而不是实现新接口,适用于功能实现了但接口不兼容的场合.适配器组合了原有对象,并且提

五分钟一个设计模式之装饰器模式

五分钟一个设计模式,用最简单的方法来描述设计模式.查看更多设计模式,请点击五分钟一个设计模式系列 http://blog.csdn.net/daguanjia11/article/category/3259443 示例代码 今天实在是想不出什么开场白来引出示例了,也想不出特别有意思的示例了,就用一个很土的例子来描述一下装饰器模式吧. 每个人都要穿衣服,每件衣服都具有某些特定的功能,例如,穿上鞋子的话走路舒服,穿上上衣的话上身不冷,穿上裤子的话腿不冷(你这不废话吗).也就是说,每件衣服都具有特定的

五分钟一个设计模式之代理模式

五分钟一个设计模式,用最简单的方法来描述设计模式. 认识代理模式 代理模式是通过创建一个代理对象,用这个代理对象去代表真实的对象,客户端得到这个代理对象后,就想得到了真实的对象一样.客户端调用代理对象来执行任务,但任务实际上最重还是由真实对象完成的. 代理模式的本质是控制对象的访问. 代理模式包含以下几部分: Subject:目标接口 RealSubject:具体的目标对象,继承自Subject Proxy:代理对象,继承自Subject,使用Proxy可以代替使用RealSubject. 示例

五分钟一个设计模式之观察者模式

五分钟一个设计模式,用最简单的方法来描述设计模式. 认识观察者模式 观察者模式的定义是:定义对象间的一种一对多的依赖关系.当一个对象的状态发生变化时,所有依赖它的对象都会得到通知并自动更新 报社跟读者的例子 我们用报社和读者之间的关系来模拟观察者模式. 包含以下主体: 报社(NewspaperOffice) 读者接口(Reader) 具体读者(Reader_二逼青年.Reader_文艺青年) Reader_二逼青年.Reader_文艺青年实现Reader接口,并订阅报纸,报社有新报纸时,会通知所

一个睡五分钟等于六个钟头的方法

一个睡五分钟等于六个钟头的方法  睡觉的诀窍    所以,根据医学和我的体验.观察,一个人真正睡着觉最多只有两个钟头,其余都是浪费时间,躺在枕头上做梦,没有哪个人不做梦.至于醒来觉得自己没有做梦,那是因为他忘记了.    通常一个人睡两个钟头就够了,为什么有人要睡七.八个钟头?那是你赖床躺在枕头上休息的习惯养成的,并非我们需要那么久的睡眠时间,尤其打坐做功夫的人晓得,正午只要闭眼真正睡着三分钟,等于睡两个钟头,不过要对好正午的时间.夜晚则要在正子时睡着,五分钟等于六个钟头.    就这个时间的学

五分钟一个设计模式之创建者模式

五分钟一个设计模式,用最简单的方法来描述设计模式. 认识创建者模式 创建者模式(又叫生成器模式)是为创建一个产品而生的,这个产品的组装算法是确定的,但零部件可以分配给多个厂商生产.使用创建者模式来创建产品,可以把产品零部件的生产和组装分开了. 创建者模式包含以下几个部分: 产品(Product) 厂商的接口(Builder) 具体的厂商(ConcreteBuilder1.ConcreteBuilder2.-ConcreteBuilderN),实现厂商接口,负责产品零部件的生产工作 指导者(Dir