javascript - 可编辑表格控件 支持全键盘操作(无JS框架)
项目中经常会用到表格编辑控件,网上也有不少,但是确实没有完全符合我要求的,
自己写一个吧!
1.该控件支持 数据显示列,文本编辑列,选择列,下拉列,索引列,删除列 六种列类型
2.支持全键盘操作,自定义键位 包括:列焦点切换,行焦点切换,新建行,数据保存(默认 上,下,左,右 键操作)
3.丰富的事件,绝大多数的客户端操作都能触发无刷新后台事件
4.支持统计运算,可自定义运算插件
5.兼容 Ie,chorme,firefox等绝大多数主流浏览器
下载地址:http://files.cnblogs.com/dint/WebGridEditor.rar
客户端调用代码:
<table id='table1' border='1' class='hgeTableCss' cellspacing='0' cellpadding='0' style='width:700px'> <tr> <th style='width:20px'></th> <th>ID</th> <th>Name</th> <th>Sex</th> <th>Address</th> <th>Content</th> <th>delete</th> </tr> <tr> <td></td> <td> 111</td> <td> </td> <td> </td> <td> </td> <td> </td> <td></td> </tr> </table> <script type='text/javascript'> var editor1; var myrows=[ ['1','2','3','bbb','5'], ['1','2','3','ccc','5'], ['1','2','3','aaa','5'], ['1','2','3','ccc','5'], ['1','2','3','bbb','5'] ]; editor1=new HtGridEditor('table1'); editor1.bIndex=true; editor1.datas.rows=myrows; editor1.vWidth='500px'; editor1.Columns=[ {type:1,defv:'111',funk:true} ,{type:1,defv:'dingtao',change:true} ,{type:1,defv:'hello',nexk:true} ,{type:2,drpItems:[{dtext:'aaa',dvalue:'aaa'}, {dtext:'bbb',dvalue:'bbb'}, {dtext:'ccc',dvalue:'ccc'}],defv:'bbb',change:true } ,null ,{type:10,defv:'del'} ]; editor1.Footers=[{index:1,colspan:2,text:'TotalA:{0},TotalB:{1}',console:['SUM-2','SUM-0']} ,{index:3,text:'合计'}];
editor1.bDownNew=true; editor1.fixedHeader=true; editor1.ShowEditor();</script>
直接上效果图了
1.表头不固定,无表尾
表头不固定 有表尾
表头固定 无表尾
表头固定 有表尾
服务器端处理请求的代码 (C#)
using System; using System.Collections; using System.Configuration; using System.Data; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using Newtonsoft.Json; namespace HTGridEditorTest { public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { string hgeAjax = Request["HGE_AJAX_VER"];//HGE_AJAX_VER HtGridEditor Ajax版本 if ((hgeAjax != null) && (hgeAjax == "1_0_0"))//HtGridEditor请求的数据 版本号 一般通过这个标识判断是否为 HtGridEditor的ajax请求 { if (Request["method"] == "REFRESH") { Response.Clear(); HgeCommand c = new HgeCommand(); c.cmd = "refresh"; ][]; Random r = new Random(); ; i < ; i++) { data[i] = ]; data[i][] = (i + ).ToString(); data[i][] = ).ToString(); data[i][] = r.Next().ToString(); data[i][] = "ccc"; data[i][] = "ddd"; } c.data = data; Response.Write(JsonConvert.SerializeObject(c)); Response.End(); } else if (Request["method"] == "REMOVED")//method 操作类型 REMOVED删除行 CREATED新建行 { Response.Clear(); HgeCommand c = new HgeCommand(); c.cmd = "message"; c.data = "delete one row "+Request["OROW"]; HgeCommand[] cs = ]; cs[] = c; Response.Write(JsonConvert.SerializeObject(cs)); Response.End(); } else if (Request["method"] == "CREATED") { Response.Clear(); string str = Request["OROW"];//新建的行的值 string[] arr = JsonConvert.DeserializeObject<string[]>(str); string resps = ""; ; i < arr.Length; i++) resps += arr[i] + ","; HgeCommand c = new HgeCommand(); c.cmd = "message"; c.data = "create a new row data:" + resps.Trim(','); HgeCommand[] cs = ]; cs[] = c; // Response.Write(JsonConvert.SerializeObject(cs)); //Response.End(); } else if (Request["method"] == "CHANGED")//选择行改变 { Response.Clear(); string str = Request["NROW"]; string[] arr = JsonConvert.DeserializeObject<string[]>(str); string resps = ""; ; i < arr.Length; i++) resps += arr[i] + ","; HgeCommand c = new HgeCommand(); c.cmd = "message"; c.data ="select row changed data:" + resps.Trim(','); HgeCommand[] cs = ]; cs[] = c; Response.Write(JsonConvert.SerializeObject(cs)); Response.End(); } else if (Request["method"] == "SAVED")//保存数据 { Response.Clear(); string[][] arr = JsonConvert.DeserializeObject<string[][]>(Request["SVDATA"]); string resps = ""; ; i < arr.Length; i++) { resps += "["; ; j < arr[i].Length; j++) { resps += arr[i][j] + ","; } resps = resps.Trim(',') + "],"; } HgeCommand c = new HgeCommand(); c.cmd = "message"; c.data = "select row saved data:" + resps.Trim(','); HgeCommand[] cs = ]; cs[] = c; Response.Write(JsonConvert.SerializeObject(cs)); Response.End(); } else if(Request["method"]=="TXTCHANGED"){//文本改变 Response.Clear(); HgeCommand c = new HgeCommand(); c.cmd = "message"; c.data ="input changed in row " + Request["IROW"] + " and cell " + Request["ICELL"] + " and value " + Request["VALUE"]+" and row value "+Request["OROW"]; HgeCommand[] cs = ]; cs[] = c; Response.Write(JsonConvert.SerializeObject(cs)); Response.End(); } else if (Request["method"] == "FOCUSNEXT")//当前编辑文本因为按enter失去焦点 { Response.Clear(); HgeCommand c = new HgeCommand(); c.cmd = "message"; c.data = "focus next in row " + Request["IROW"] + " and cell " + Request["ICELL"] + " and value " + Request["VALUE"] +" and row value "+ Request["OROW"]; HgeCommand[] cs = ]; cs[] = c; Response.Write(JsonConvert.SerializeObject(cs)); Response.End(); //服务器端可以使用如下的命令控制客互端的行为 命令的详细说明见 HtGridEditor.js /*HgeCommand c = new HgeCommand(); c.cmd="message"; c.data=" hello HtGridEditor !";*/ /*HgeCommand c = new HgeCommand(); c.cmd = "selectopitons"; c.icell = "4"; c.selectvalue = "5555"; string[][] options=new string[6][]; options[0] = new string[2] { "EEEE", "1111" }; options[1] = new string[2] { "FFFF", "2222" }; options[2] = new string[2] { "GGGG", "3333" }; options[3] = new string[2] { "HHHH", "4444" }; options[4] = new string[2] { "IIII", "5555" }; options[5] = new string[2] { "JJJJ", "6666" }; c.data = options; c.select_cache = "cache";*/ /*HgeCommand c = new HgeCommand(); c.cmd = "setcell"; c.data = new string[3] { "1", "2", "hello test setcell command" };*/ /*HgeCommand c = new HgeCommand(); c.cmd = "setcells"; string[][] cells = new string[3][]; cells[0] = new string[3] {"1","2","test setcells command"}; cells[1] = new string[3] {"2","4","aaa"}; c.data = cells;*/ /*HgeCommand c = new HgeCommand(); c.cmd = "setrow"; c.data = new string[5]{"2", "cell a", "cell b", "cell c", "bbb"};*/ /*HgeCommand c = new HgeCommand(); c.cmd = "setrowedit"; c.data = "4";*/ /*HgeCommand c = new HgeCommand(); c.cmd = "setcellfocus"; c.data = "2";*/ /*HgeCommand c = new HgeCommand(); c.cmd = "newrow"; c.data = "focus";*/ /*HgeCommand[] cs = new HgeCommand[1]; cs[0] = c; Response.Write(JsonConvert.SerializeObject(cs)); Response.End();*/ //也可以由若干命令组合使用 前端会按顺序执行 //如:新建一行 使其获得焦点 且中当前列 /* HgeCommand[] cs = new HgeCommand[2]; HgeCommand c = new HgeCommand();//新建一行 c.cmd = "newrow"; c.data = "focus"; cs[0] = c; c = new HgeCommand();//使新行的当前列获得焦点 c.cmd = "setcellfocus"; c.data = Request["ICELL"]; cs[1] = c; Response.Write(JsonConvert.SerializeObject(cs)); Response.End();*/ } } else { } } } public class HgeCommand { public string cmd; public string icell; public string selectvalue; public string select_cache; public object data; } }
javascript - 可编辑表格控件 支持全键盘操作(无JS框架)的更多相关文章
- Qt实现表格控件-支持多级列表头、多级行表头、单元格合并、字体设置等
目录 一.概述 二.效果展示 三.定制表头 1.重写数据源 2.重写QHeaderView 四.设置属性 五.相关文章 原文链接:Qt实现表格控件-支持多级列表头.多级行表头.单元格合并.字体设置等 ...
- QRowTable表格控件-支持hover整行、checked整行、指定列排序等
目录 一.开心一刻 二.嘴一嘴 三.效果展示 四.浅谈实现 五.自定义数据源 1.data函数 2.flags函数 六.自定义视图 1.目的 2.问题分析 七.测试 八.相关文章 原文链接:QRowT ...
- QRowTable表格控件(五)-重写表头排序、支持第三次单击恢复默认排序
目录 一.原生表格 二.效果展示 三.实现方式 1.排序列定制 2.排序交互修改 四.相关文章 原文链接:QRowTable表格控件(五)-重写表头排序.支持第三次单击恢复默认排序 一.原生表格 开发 ...
- Qt实现表格树控件-支持多级表头
目录 一.概述 二.效果展示 三.实现方式 四.多级表头 1.数据源 2.表格 3.QStyledItemDelegate绘制代理 五.测试代码 六.相关文章 原文链接:Qt实现表格树控件-支持多级表 ...
- 深入浅出ExtJS 第三章 表格控件
3.1 表格的特性简介 >.Ext中的表格功能:包括排序/缓存/拖动/隐藏某一列/自动显示行号/列汇总/单元格编辑等实用功能; >.表格由类Ext.grid.GridPanel定义,继承自 ...
- QRowTable表格控件(三)-效率优化之-合理使用QStandardItem
目录 一.开心一刻 二.概述 三.效果展示 四.QStandardItem 1.QStandardItem是什么鬼 2.性能分析 3.QStandardItem使用上的坑 五.相关文章 原文链接:QR ...
- QTableView表格控件区域选择-自绘选择区域
目录 一.开心一刻 二.概述 三.效果展示 四.实现思路 1.绘制区域 2.绘制边框 3.绘制 五.相关文章 原文链接:QTableView表格控件区域选择-自绘选择区域 一.开心一刻 陪完客户回到家 ...
- QRowTable表格控件(二)-红涨绿跌
目录 一.开心一刻 二.概述 三.效果展示 四.任务需求 五.指定列排序 六.排序 七.列对其方式 八.相关文章 原文链接:QRowTable表格控件(二)-红涨绿跌 一.开心一刻 一天,五娃和六娃去 ...
- QRowTable表格控件(四)-效率优化之-优化数据源
目录 一.开心一刻 二.问题分析 三.重写数据源 1.自己存储数据 2.重写data接口 四.比较 五.相关文章 原文链接:QRowTable表格控件(四)-效率优化之-优化数据源 一.开心一刻 一程 ...
随机推荐
- zookeeper+jstorm的集群搭建
zookeeper的配置: zookeeper有三种配置方式:单机式/伪分布式/集群式 其中伪分布式是在一台电脑上通过不同的端口来模拟分布式情形,需要N份配置文件和启动程序,而集群式是多个zookee ...
- Python学习笔记 for windows
学习来源 http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001374738136 ...
- linux后台查看共享内存和消息队列的命令
ipcs ipcs -q : 显示所有的消息队列 ipcs -qt : 显示消息队列的创建时间,发送和接收最后一条消息的时间 ipcs -qp: 显示往消息队列中放消息和从消息队列中取消息的进程ID ...
- 使用clearInterval清除计时循环时,最后一次循环还是会执行解决办法
原代码: var interv=setInterval(function(){ alert("setInterval执行"); },2000) clearInterval(inte ...
- MongoDB的安装和配置成服务的三种方法和一些难点
1. Hotfix KB2731284 or later update is not installed的问题: If you are running any edition of Windows S ...
- LeetCode Add Two Numbers II
原题链接在这里:https://leetcode.com/problems/add-two-numbers-ii/ 题目: You are given two linked lists represe ...
- TestNG测试报告美化buid.xml配置
<?xml version="1.0" encoding="UTF-8"?> <project name="myproject&qu ...
- 原生node的header
首先引入http模块 获取http.ServerResponse对象的方式,1.http.createServer(function(req,res){}) 其中res是http.ServerResp ...
- Java不同编码方式,中英文字符所占字节数
测试代码 public class Test { public static void main(String[] args){ String[] charsetNames={ "UTF-8 ...
- spark转换集合为RDD
SparkContext可以通过parallelize把一个集合转换为RDD def main(args: Array[String]): Unit = { val conf = new SparkC ...