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表格控件(四)-效率优化之-优化数据源 一.开心一刻 一程 ...
随机推荐
- Nginx中FastCGI配置优化
FastCGI: FastCGI是从CGI发展改进而来的.传统CGI接口方式的主要缺点是性能很差,因为每次HTTP服务器遇到动态程序时都需要重新启动脚本解析器来执行解析,然后结果被返回给HTTP服务器 ...
- linux添加环境变量(centos)
1.查看当前环境变量 #echo $PATH 2.增加环境变量 #vi /etc/profile export PATH=/usr/path/bin:$PATH 3.生效 #source /etc/p ...
- Apache Kafka – KIP 32,33 Time Index
32, 33都是和时间相关的, KIP-32 - Add timestamps to Kafka message 引入版本,0.10.0.0 需要给kafka的message加上时间戳,这样更方便一些 ...
- 给Source Insight做个外挂系列之三--构建外挂软件的定制代码框架
上一篇文章介绍了“TabSiPlus”是如何进行代码注入的,本篇将介绍如何构建一个外挂软件最重要的部分,也就是为其扩展功能的定制代码.本文前面提到过,由于windows进程管理的限制,扩展代码必须以动 ...
- 线程中调用python win32com
在python的线程中,调用win32com.client.Dispatch 调用windows下基于COM组件的应用接口, 需要在调用win32com.client.Dispatch前,调用pyth ...
- html中submit和button的区别/ window.location.href 不跳转 的问题
<input type="button"> <input type="submit"> 这两个的区别 是 button 不会自动提交表 ...
- HTML中head里的内容经浏览器解析后全到body里了
HTML中head里的内容经浏览器解析后全到body里了 修改完代码后,用chrome审查元素,head里的内容都到body中去了 http://bbs.csdn.net/topics/3802586 ...
- 在java中获取attr的值
首先说如何获取已经在style里面定义好的attr的值,以colorPrimary为例: TypedValue value = new TypedValue(); mContext.getTheme( ...
- LeetCode Nested List Weight Sum
原题链接在这里:https://leetcode.com/problems/nested-list-weight-sum/ 题目: Given a nested list of integers, r ...
- 用Merge来改写相关更新的例子
下面的两个SQL是等价的,但是一个执行N小时都执行不完,一个花了一分钟. 执行计划显示第一个语句是由外面的即将被更新的表驱动内层,相对于是一个NEST LOOP,cost非常大.第二个语句是内层单独执 ...