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 ...
随机推荐
- Linux历史上线程的3种实现模型
一.概述 这里以Linux为例.Linux历史上,最开始使用的线程是LinuxThreads,但Li ...
- 使用Freemarker创建word文档
最近做一个项目,本来是直接在网页上查看文本信息,然后给客户直接打印的,但是发现也许是浏览器还是打印机的原因,总之,有个客户打印出来的格式始终与其他的不同,没办法,最后想到了直接将数据库中的信息生成一个 ...
- Linux下安装zookeeper集群
首先,准备三台Linux虚拟机 三台机器 centos01 :192.168.1.168(lxs001) centos03 :192.168.1.178(lxs003) centos03 :1 ...
- Javascript中 a.href 和 a.getAttribute('href') 结果不完全一致
今天无意中发现这个么问题,页面上对所有A标签的href属性为空的自动添加一个链接地址,结果发现if判断条件始终都没生效,莫名其妙. 原来Javascript中 a.href 和 a.getAttrib ...
- python绝技 — 扫描蓝牙RFCOMM信道
RFCOMM协议 RFCOMM通过蓝牙L2CAP协议模拟了RS232串口.这会与另一台设备建立一个蓝牙连接,模拟一条普通的串行线缆,使用户能够用其他设备控制这一台设备,通过蓝牙打电话,发短信,读取手机 ...
- 如何使用jQuery动态的在body里添加script标签?
var script = document.createElement('script'); script.type = 'text/jacascript'; script.src = 'url'; ...
- Android设备标识符的使用
设备ID(DeviceId) 获取办法 android.telephony.TelephonyManager tm = (android.telephony.TelephonyManager) con ...
- readelf -s 命令‘symbol’名字显示不全
GCC编译出来的object(目标文件)getPon.o,在链接时(ld)报了一个错误说找不到一个函数(undefined reference to identifier devCtl_getEthe ...
- CODE[VS]-寻找子串位置-字符串处理-天梯青铜
题目描述 Description 给出字符串a和字符串b,保证b是a的一个子串,请你输出b在a中第一次出现的位置. 输入描述 Input Description 仅一行包含两个字符串a和b 输出描述 ...
- noip 2016 提高组题解
前几天写的那个纯属搞笑.(额,好吧,其实这个也不怎么正经) 就先说说day2吧: T1:这个东西应该叫做数论吧. 然而我一看到就照着样例在纸上推了大半天(然而还是没有看出来这东西是个杨辉三角) 然后就 ...