Webform动态创建删除行及后台取值
开发过程中经常碰到许多不确定事项,所以有时需要动态生成新的记录,如图所示,点击新增时新增一条参考记录,点击删除时则删除该记录:
第一步,创建一个表格,用hidden记录当前最大行数,添加时则只需复制模板并修改ID(由于lable最终生成的html是span标签,不方便后台取值,所以换成了textbox)
<table class="table-bordered" style="width:100%;text-align:center">
<thead class="form-group">
<tr class="bg-primary">
<td>参考房源
</td>
<td>评估单价
</td>
<td>建筑面积
</td>
<td>评估总价=评估单价*建筑面积
</td>
<td>
<input type="button" id="btnAdd" class="btn-info" value="新增" onclick="addRow()" />
<asp:HiddenField ID="hidRows" runat="server" ClientIDMode="Static" Value="" />
</td>
</tr>
</thead>
<tbody id="tbBody" class="form-group">
<tr id="tr_0" style="display: none" class="bg-warning">
<td>
<asp:DropDownList runat="server" ID="drpHouseSource_0" ClientIDMode="Static" AppendDataBoundItems="true">
<asp:ListItem Value="">请选择</asp:ListItem>
<asp:ListItem Value="">搜房</asp:ListItem>
<asp:ListItem Value="">安居客</asp:ListItem>
</asp:DropDownList>
</td>
<td>
<asp:TextBox runat="server" ID="txtAvgPrice_0" ClientIDMode="Static" onchange="calaTotalPrice(this)"></asp:TextBox>
</td>
<td>
<asp:TextBox runat="server" ID="txtBuildingArea_0" ClientIDMode="Static" ReadOnly="true" BorderStyle="None" Text=""></asp:TextBox>
</td>
<td>
<asp:TextBox runat="server" ID="txtTotalPrice_0" ClientIDMode="Static" ReadOnly="true" BorderStyle="None"></asp:TextBox>
</td>
<td>
<input type="button" id="btnDelete_0" class="btn-danger" value="删除" onclick="deleteRow(this)" />
</td>
</tr>
</tbody>
<tfoot class="form-group">
<tr class="bg-danger">
<td>评估人员
</td>
<td>评估单价(最终)
</td>
<td>建筑面积(最终)
</td>
<td>评估总价(最终) = 评估单价(最终) * 建筑面积(最终)
</td>
<td></td>
</tr>
<tr class="bg-info">
<td>
<asp:Label runat="server" ID="lblAssessPerson" ClientIDMode="Static"></asp:Label>
</td>
<td>
<asp:TextBox runat="server" ID="txtFinalAvgPrice" ClientIDMode="Static" onchange="calaFinalTotalPrice(this)"></asp:TextBox>
</td>
<td>
<asp:Label runat="server" ID="lblFinalBuildingArea" ClientIDMode="Static" Text=""></asp:Label>
</td>
<td>
<asp:Label runat="server" ID="lblFinalTotalPrice" ClientIDMode="Static"></asp:Label>
</td>
<td></td>
</tr>
<tr class="bg-success">
<td>评估备注:
</td>
<td colspan="">
<asp:TextBox runat="server" ID="txtAssessRemark" ClientIDMode="Static" Width=""></asp:TextBox>
</td>
</tr>
<tr>
<td colspan="">
<asp:Button runat="server" ID="btnSubmit" CssClass="btn-success" OnClick="btnSubmit_Click" Text="提交" />
</td>
</tr>
</tfoot>
</table>
第二步,复制模板行替换里面的编号并添加到末尾
//添加一条新记录
function addRow() {
var currentRows = parseInt($("#hidRows").val()); //当前最大行数
var tempTr = $("#tr_0").html(); //模板行的html
var newTr = "<tr id=\"tr_" + (currentRows + ) + "\" class=\"bg-warning\"> " //需新增行的html
+ tempTr.replace(/_0/g, "_" + (currentRows + )) + "</tr>"; var tbody = $("#tbBody");
$(newTr).appendTo(tbody); //把需新增的行放到最后面
$("#hidRows").val(currentRows + ); //当前最大行加1
}
第三步,删除指定行
//删除一条记录
function deleteRow(obj) {
var objId = $(obj).attr("id");
var objIndex = getIndexById(objId); var maxRow = $("#hidRows").val();
if (objIndex != maxRow) { //判断删除行是否为最后一行
var tbody = $("#tbBody");
tbody.children("tr").each(function () { //循环当前所有行
var currentId = $(this).attr("id");
var currentIndex = getIndexById(currentId); if (currentIndex > objIndex) { //比较当前行和需删除行的位置,如在之后,则id和name需前移
$(this).attr("id", currentId.replace(currentIndex, (currentIndex - ))); $(this).find("input").each(function () { //循环当前行里面所有input标签并前移一个位置
if ($(this).attr("name") != undefined)
$(this).attr("name", $(this).attr("name").replace(currentIndex, (currentIndex - )));
if ($(this).attr("id") != undefined)
$(this).attr("id", $(this).attr("id").replace(currentIndex, (currentIndex - )));
});
$(this).find("select").each(function () { //循环当前行里面所有select标签并前移一个位置
if ($(this).attr("name") != undefined)
$(this).attr("name", $(this).attr("name").replace(currentIndex, (currentIndex - )));
if ($(this).attr("id") != undefined)
$(this).attr("id", $(this).attr("id").replace(currentIndex, (currentIndex - )));
});
$(this).find("span").each(function () { //循环当前行里面所有span标签并前移一个位置
if ($(this).attr("name") != undefined)
$(this).attr("name", $(this).attr("name").replace(currentIndex, (currentIndex - )));
if ($(this).attr("id") != undefined)
$(this).attr("id", $(this).attr("id").replace(currentIndex, (currentIndex - )));
});
}
});
}
$("#tr_" + objIndex).remove(); //移除该行
$("#hidRows").val(maxRow - ); //最大行减1
}
第四步,添加一些自定义方法(如单价改变时自动计算总价)
//根据ID获取当前所在行的位置
function getIndexById(objId) {
return objId.substring(objId.indexOf("_") + );
}
//单价变化时计算总价
function calaTotalPrice(obj) {
var objId = $(obj).attr("id");
var objIndex = getIndexById(objId);
var avgVal = $(obj).val();
var areaVal = $("#txtBuildingArea_" + objIndex).val(); $("#txtTotalPrice_" + objIndex).val(avgVal * areaVal);
}
//最终单价变化时计算最终总价
function calaFinalTotalPrice(obj) {
var avgVal = $(obj).val();
var areaVal = $("#lblFinalBuildingArea").text(); $("#lblFinalTotalPrice").text(avgVal * areaVal);
}
最后后台取值并保存
/// <summary>
/// 根据控件name获取值
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
private string GetValue(string name)
{
return Request[name];
}
protected void btnSubmit_Click(object sender, EventArgs e)
{
List<HouseAssess> houseList = null;
HouseAssess house = null;
int maxRows = Convert.ToInt32(hidRows.Value); //当前最大行
if (maxRows > ) //判断当前是否有记录
{
houseList = new List<HouseAssess>();
for (int i = ; i <= maxRows; i++) //循环取值
{
house = new HouseAssess();
house.HouseSource = GetValue("drpHouseSource_" + i);
house.AvgPrice = Convert.ToDecimal(GetValue("txtAvgPrice_" + i));
house.BuildingArea = Convert.ToDecimal(GetValue("txtBuildingArea_" + i));
house.TotalPrice = Convert.ToDecimal(GetValue("txtTotalPrice_" + i)); houseList.Add(house);
}
}
}
Webform动态创建删除行及后台取值的更多相关文章
- js从后台取值并绑定到元素上
		
用ajax从后台取值不是什么有技术含量的活计,把后台取来的值绑定到Vue对象上也不算难,但每一次向后台拿数据的时候都得写上这么一段代码就十分痛苦了. 于是我写了这么一小段js代码,能够自己根据url去 ...
 - 前台改变asp button控件的值,后台取值没有改变的问题
		
前台: <asp:Button ID="btnEdit" Style="margin-left: 600px;" runat="server&q ...
 - chrome 和IE 上传的文件,在net 后台取值Request.Form.Files[0].FileName 的不同
		
chrome 和IE 上传的文件,在net 后台取值Request.Form.Files[0].FileName 的不同 chrome 获得的是不含路径的纯文件名 IE获得的是含路径的文件名
 - JQuery动态添加控件并取值
		
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
 - Ext.form.ComboBox  后台取值 动态加载    ext5.0.0
		
我用的extjs是5.0.0版本的. 请注意:如果这里没有的combobox相关内容,这里一定有. 开始的时候keyup事件取到的数据就是放不到ComboBox中,放全局变量也不好用.最后大神出手帮忙 ...
 - omDialog设计造成控件无法后台取值
		
http://ui.operamasks.org/website/homepage.html 使用服务端控件,前台进行赋值,但后台确无法取值. 不仅如此,如果里面放置了一个ASp:Button同样无法 ...
 - .net TxetBox控件设置ReadOnly=True后台取值问题
		
1.为TxetBox添加onfocus=this.blur()进行模拟 2.通过 Request.From["TextBox"].Trim()取值; 3.后台CS文件设置TextB ...
 - asp.net textbox控件readonly为true时,后台取值的问题
		
如题,在后台通过textbox.Text方式取值为空,不论你默认值是否是空,如想要获得,需通过request.Form[""]的方式.
 - ASP.NET页面使用JQuery EasyUI生成Dialog后台取值为空
		
原因: JQuery EasyUI生成Dialog后原来的文档结构发生了变化,原本在form里的内容被移动form外面,提交到后台后就没有办法取值了. 解决办法: 在生成Dialog后将它append ...
 
随机推荐
- 横瓜先生关于如何利用MYSQL数据库设计CMS系统处理100亿级TB规模的数据量
			
遥执乾坤(44758121) 18:21:23 mysql据说只能使用一个索引,我这里几乎所有字段都有索引. 但每个字段就算用索引,也需要扫描至少100w以上记录. 横瓜(601069289) 1 ...
 - android开发之res下的menu (xml+代码的形式)
			
转载请注明出处:http://blog.csdn.net/fth826595345/article/details/9199393 先来看Menu XML文件如何编写: <?xml versi ...
 - 基于TcpListener实现最简单的http服务器
			
最近实现一套简单的网络程序.为了查看程序内部的变量,方便调试.就在想搞一个最最简单的方式.第一个想到写文件,日志.这个不实时,而且打开麻烦,pass .于是想到用网络输出.本来是想写成c/s模式,想着 ...
 - CMake学习
			
CMake学习 本篇分享一下有关CMake的一些学习心得以及相关使用. 作者:AlphaGL.版权所有,欢迎保留原文链接进行转载 :) 本文目录如下: 1.CMake介绍 2.CMake安装与使用 2 ...
 - 关于ABP——领域服务的思考
			
我在刚接触ABP的时候一直有一个疑问--有了应用服务,为什么还需要领域服务呢? 领域服务和应用服务对比 领域服务 应用服务 返回值 Entity DTO 被表现层调用 不可以(非强制) 可以 在ABP ...
 - C语言之while和do-while
			
一 while和do-while的简介 1). while语句 语法: while(表达式){ 循环体; } 循环过程: 1.先判断表达式,是否为真,如果为真跳转到2,否则跳转到3 2.执行循环体,执 ...
 - Python print报ascii编码异常的靠谱解决办法
			
之前遇到此异常UnicodeEncodeError: 'ascii' codec can't encode characters...,都是用这种方式解决:sys.setdefaultencoding ...
 - H5与CS3权威下.18 and 19 选择器(1)
			
18章.CSS3概述 1.从前端技术的角度把互联网的发展分为三个阶段: (1)web1.0:HTML和CSS. (2)web2.0:Ajax,Javascript/DOM/异步数据请求. (3)web ...
 - 【转】【WebService】.NET C# 创建WebService服务
			
Web service是一个基于可编程的web的应用程序,用于开发分布式的互操作的应用程序,也是一种web服务 WebService的特性有以下几点: 1.使用XML(标准通用标记语言)来作为数据交互 ...
 - python绝技 — 搜寻蓝牙设备
			
需要安装蓝牙模块:pybluez sudo pip install pybluez 代码 #!/usr/bin/env python #--*--coding=utf-8--*-- #P191 #su ...