在Winform开发的时候,咱们不少时候能够利用表格控件来直接录入数据,不过在Web上较少看到,其实也能够利用dataTable对象处理直接录入表格行数据,这个能够提升数据的录入方便,特别是在一些简单业务的明细数据的时候,看起来会比弹出窗口录入方便一些,也高大上一点。本篇主要介绍在Bootstrap开发框架中使用dataTable直接录入表格行数据。javascript
一、基于表格直接录入数据和Winform的界面回顾html
前端精品教程:百度网盘下载前端
在开始Web界面直接录入表格行数据前,咱们先来看看Winform界面的处理状况,如我在流程管理里面,对于具备主从明细的报销业务表的数据处理,采用了下面的界面。java
这种明细表单能够直接在表格控件Griview上进行新增、编辑处理。node
而对于Web界面,若是咱们要保持和这个布局相似的话,采用dataTable直接录入表格行数据也能够达到。面试
前端精品教程:百度网盘下载算法
上面的界面处理明细数据的时候,能够直接使用新增记录,直接在录入框中输入数据,而后保存起来,保存后数据变为只读,若是须要修改,还能够单击编辑按钮进行修改。数据库
而这些明细的数据,也仅仅存在JS的对象里面,尚未保存到后台数据库中,咱们能够在最后保存(如上界面的肯定按钮)处理中再获取所有添加的数据进行提交便可。json
在这些数据提交以后,咱们在查看界面里面能够能够Bootstrap Table插件来展现数据便可。小程序
前端精品教程:百度网盘下载
二、在Web上使用dataTable直接录入表格行数据的实现
上面的界面展现了在Web上使用dataTable直接录入表格行数据和数据展现,这里开始介绍它们的界面和实现代码。
界面部分主要是这个明细的处理。
界面视图的HTML代码以下所示。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
<
div
class
=
"portlet light portlet-fit "
>
<
div
class
=
"portlet-title"
>
<
div
class
=
"caption"
>
<
i
class
=
"icon-settings font-red"
></
i
>
<
span
class
=
"caption-subject font-red sbold uppercase"
>明细清单</
span
>
</
div
>
</
div
>
<
div
class
=
"portlet-body"
>
<
div
class
=
"table-toolbar"
>
<
div
class
=
"row"
>
<
div
class
=
"col-md-6"
>
<
div
class
=
"btn-group"
>
<
button
id
=
"detail_editable_1_new"
class
=
"btn green"
>
新增记录
<
i
class
=
"fa fa-plus"
></
i
>
</
button
>
</
div
>
</
div
>
</
div
>
</
div
>
<
table
class
=
"table table-striped table-hover table-bordered"
id
=
"detail_editable_1"
>
<
thead
>
<
tr
>
<
th
>序号</
th
>
<
th
> 费用类型 </
th
>
<
th
> 发生时间 </
th
>
<
th
> 费用金额(元) </
th
>
<
th
> 费用说明 </
th
>
<
th
> 编辑 </
th
>
<
th
> 删除 </
th
>
</
tr
>
</
thead
>
<
tbody
>
@*<
tr
>
<
td
> 1 </
td
>
<
td
> 交通费 </
td
>
<
td
> 2018-10-01 </
td
>
<
td
> 2000 </
td
>
<
td
> 备注信息 </
td
>
<
td
>
<
a
class
=
"edit"
href
=
"javascript:;"
rel
=
"external nofollow"
rel
=
"external nofollow"
> 编辑 </
a
>
</
td
>
<
td
>
<
a
class
=
"delete"
href
=
"javascript:;"
rel
=
"external nofollow"
rel
=
"external nofollow"
> 删除 </
a
>
</
td
>
</
tr
>*@
</
tbody
>
</
table
>
</
div
>
</
div
>
|
其中主要是ID为 detail_editable_1 的标记,这个就是承载明细信息的表格,咱们能够定义咱们须要的表头信息,而输入框的内容,则能够经过dataTable插件的对象进行动态添加。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
//定义dataTable对象
var
table = $(
'#detail_editable_1'
);
var
oTable = table.dataTable({
"lengthMenu"
: [
[5, 15, 20, -1],
[5, 15, 20,
"All"
]
// 改变每页的行数
],
// 使用汉化
"language"
: {
url:
'//cdn.datatables.net/plug-ins/3cfcc339e89/i18n/Chinese.json'
},
//初始化
"pageLength"
: 5,
"columnDefs"
: [{
// 设置默认列设置
'orderable'
:
true
,
'targets'
: [0]
}, {
"searchable"
:
true
,
"targets"
: [0]
}],
"order"
: [
[0,
"asc"
]
]
// 将第一列设置为asc的默认排序
});
|
编辑行记录,就是动态增长一些Input控件,让用户能够录入数据,以下代码所示。
1
2
3
4
5
6
7
8
9
10
11
12
|
//编辑行
function
editRow(oTable, nRow) {
var
aData = oTable.fnGetData(nRow);
var
jqTds = $(
'>td'
, nRow);
jqTds[0].innerHTML =
'<input type="text" class="form-control input-small" value="'
+ aData[0] +
'" readonly>'
;
jqTds[1].innerHTML =
'<input type="text" class="form-control input-small" value="'
+ aData[1] +
'">'
;
jqTds[2].innerHTML =
'<input type="date" class="form-control input-small" value="'
+ aData[2] +
'">'
;
jqTds[3].innerHTML =
'<input type="number" class="form-control input-small" value="'
+ aData[3] +
'">'
;
jqTds[4].innerHTML =
'<input type="text" class="form-control input-small" value="'
+ aData[4] +
'">'
;
jqTds[5].innerHTML =
'<a class="edit" href="">保存</a>'
;
jqTds[6].innerHTML =
'<a class="cancel" href="">取消</a>'
;
}
|
保存数据后,经过把记录更新到对应TD对象里面,以下所示。
前端精品教程:百度网盘下载
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
//费用类型 发生时间 费用金额 费用说明
var
objList = [];
//保存行数据,切换到普通模式
function
saveRow(oTable, nRow) {
var
jqInputs = $(
'input'
, nRow);
//更新行中每一个input的值
oTable.fnUpdate(jqInputs[0].value, nRow, 0,
false
);
oTable.fnUpdate(jqInputs[1].value, nRow, 1,
false
);
oTable.fnUpdate(jqInputs[2].value, nRow, 2,
false
);
oTable.fnUpdate(jqInputs[3].value, nRow, 3,
false
);
oTable.fnUpdate(jqInputs[4].value, nRow, 4,
false
);
oTable.fnUpdate(
'<a class="edit" href="">编辑</a>'
, nRow, 5,
false
);
oTable.fnUpdate(
'<a class="delete" href="">删除</a>'
, nRow, 6,
false
);
oTable.fnDraw();
}
|
在界面上的几个出来动做按钮,如新增、编辑、保存、删除等按钮处理事件以下所示。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
var
addRow = 1;
$(
'#detail_editable_1_new'
).click(
function
(e) {
e.preventDefault();
if
(nNew && nEditing) {
if
(confirm(
"前面记录没有保存,您是否须要保存?"
)) {
saveRow(oTable, nEditing);
//$(nEditing).find("td:first").html("未保存");
nEditing =
null
;
nNew =
false
;
}
else
{
oTable.fnDeleteRow(nEditing);
// cancel
nEditing =
null
;
nNew =
false
;
return
;
}
}
//添加一条新的记录
var
aiNew = oTable.fnAddData([addRow++,
''
,
''
,
''
,
''
,
''
,
''
]);
var
nRow = oTable.fnGetNodes(aiNew[0]);
editRow(oTable, nRow);
nEditing = nRow;
nNew =
true
;
});
//删除操做
table.on(
'click'
,
'.delete'
,
function
(e) {
e.preventDefault();
if
(confirm(
"您确认要删除该行记录吗?"
) ==
false
) {
return
;
}
//获取上一级tr行的数据
var
nRow = $(
this
).parents(
'tr'
)[0];
var
aData = oTable.fnGetData(nRow);
var
found =
false
;
$.each(objList,
function
(i, item) {
if
(item[
"seq"
] == aData[0]) {
found =
true
;
objList.splice(i, 1);
}
});
oTable.fnDeleteRow(nRow);
});
//取消操做
table.on(
'click'
,
'.cancel'
,
function
(e) {
e.preventDefault();
if
(nNew) {
oTable.fnDeleteRow(nEditing);
nEditing =
null
;
nNew =
false
;
}
else
{
restoreRow(oTable, nEditing);
nEditing =
null
;
}
});
//编辑操做
table.on(
'click'
,
'.edit'
,
function
(e) {
e.preventDefault();
nNew =
false
;
/*获取所击链接的行对象*/
var
nRow = $(
this
).parents(
'tr'
)[0];
if
(nEditing !==
null
&& nEditing != nRow) {
/* 当前正在编辑 - 但不是此行 - 在继续编辑模式以前恢复旧版 */
restoreRow(oTable, nEditing);
editRow(oTable, nRow);
nEditing = nRow;
}
else
if
(nEditing == nRow &&
this
.innerHTML ==
"保存"
) {
/* 编辑该行,并准备保存记录 */
saveRow(oTable, nEditing);
nEditing =
null
;
}
else
{
/* No edit in progress - let's start one */
editRow(oTable, nRow);
nEditing = nRow;
}
});
}
|
咱们在最后一步,提交数据的时候,就是遍历整个表格,获取每行的数据,并把它们放到JSON对象列表里面,在提交到后台录入便可,以下是获取列表数据的JS代码
前端精品教程:百度网盘下载
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
//获取表格的数据,并返回对象列表
function
GetData() {
var
list = [];
var
trs = table.fnGetNodes();
for
(
var
i = 0; i < trs.length; i++) {
var
data = table.fnGetData(trs[i]);
//获取指定行的数据
var
obj = {};
//obj["seq"] = data[0];//序号
obj[
"FeeType"
] = data[1];
obj[
"OccurTime"
] = data[2];
obj[
"FeeAmount"
] = data[3];
obj[
"FeeDescription"
] = data[4];
list.push(obj);
}
return
list;
};
|
获取到表格明细的数据后,咱们就是肯定如何提交到MVC后台接口来处理了,下面是业务里面关于明细数据提交MVC后台的JS代码。
后台MVC控制器的C#处理逻辑代码以下所示。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
/// <summary>
/// 保存申请单主从表数据
/// </summary>
/// <returns></returns>
[HttpPost]
public
ActionResult SaveApply(JObject param)
{
dynamic obj = param;
if
(obj !=
null
)
{
var result =
new
CommonResult();
if
(obj.info !=
null
)
{
//获取主信息
var info = (JObject.FromObject(obj.info)).ToObject<ReimbursementInfo>();
//转换为明细信息
List<ReimbursementDetailInfo> details =
null
;
if
(obj.details !=
null
)
{
details = (JArray.FromObject(obj.details)).ToObject<List<ReimbursementDetailInfo>>();
}
if
(info !=
null
)
{
//修改部分信息
OnBeforeInsert(info);
bool
succeed = BLLFactory<Reimbursement>.Instance.Insert(info);
if
(succeed)
{
if
(details !=
null
)
{
foreach
(var detailInfo
in
details)
{
//设置关键信息
detailInfo.Apply_ID = info.Apply_ID;
detailInfo.Header_ID = info.ID;
BLLFactory<ReimbursementDetail>.Instance.InsertUpdate(detailInfo, detailInfo.ID);
}
}
result.Success = succeed;
}
}
}
return
ToJsonContent(result);
}
else
{
throw
new
MyApiException(
"传递参数错误"
);
}
}
|
其中对于提交上来的数据,对象信息用JObject进行转换,而对于明细列表则使用JArray.FromObject进行转换,其余部分就是如何保存主表和明细表的接口了。
从案例中学习SQL数据库优化手把手带你入坑H5与小程序直播开发传智播客nodejs入门到精通(基础就业)全套nodejs视频教程HttpHelper万能框架1.9.0.6源码2018优才Web PHP全栈工程师高级教程-调优-高性能-亿级架构泰牛2017年PHP基础班+大牛班+高级课程全套PHP千万级秒杀项目实战附带视频讲解+代码演示+课程介绍+总结PHP攻城狮 - PHP从基础语法到原生项目开发2018千锋教育全套PHP视频教程微专业Android安卓开发工程师从入门到精通全套高清视频教程配套资料齐全微专业Java工程师聚焦Java开发工程师必知必会的知识技能全套高清视频与配套资料Spring Cloud微服务实战Vue2.5开发去哪儿网App 从零基础入门到实战项目Kotlin打造完整电商APP 模块化+MVP+主流框架全新升级 Kotlin系统入门与进阶全程MVP手把手 打造IM即时通信Android APPWebpack + React全栈工程架构项目实战精讲全面系统讲解CSS 工做应用+面试一步搞定揭秘一线互联网企业 前端JavaScript高级面试面试算法精讲