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="0" />
                        </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="0">搜房</asp:ListItem>
                                <asp:ListItem Value="1">安居客</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="10"></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="10"></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="4">
                            <asp:TextBox runat="server" ID="txtAssessRemark" ClientIDMode="Static" Width="1160"></asp:TextBox>
                        </td>
                    </tr>
                    <tr>
                        <td colspan="5">
                            <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 + 1) + "\"  class=\"bg-warning\"> " //需新增行的html
                + tempTr.replace(/_0/g, "_" + (currentRows + 1)) + "</tr>";

            var tbody = $("#tbBody");
            $(newTr).appendTo(tbody);                       //把需新增的行放到最后面
            $("#hidRows").val(currentRows + 1);             //当前最大行加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 - 1)));

                        $(this).find("input").each(function () {        //循环当前行里面所有input标签并前移一个位置
                            if ($(this).attr("name") != undefined)
                                $(this).attr("name", $(this).attr("name").replace(currentIndex, (currentIndex - 1)));
                            if ($(this).attr("id") != undefined)
                                $(this).attr("id", $(this).attr("id").replace(currentIndex, (currentIndex - 1)));
                        });
                        $(this).find("select").each(function () {       //循环当前行里面所有select标签并前移一个位置
                            if ($(this).attr("name") != undefined)
                                $(this).attr("name", $(this).attr("name").replace(currentIndex, (currentIndex - 1)));
                            if ($(this).attr("id") != undefined)
                                $(this).attr("id", $(this).attr("id").replace(currentIndex, (currentIndex - 1)));
                        });
                        $(this).find("span").each(function () {         //循环当前行里面所有span标签并前移一个位置
                            if ($(this).attr("name") != undefined)
                                $(this).attr("name", $(this).attr("name").replace(currentIndex, (currentIndex - 1)));
                            if ($(this).attr("id") != undefined)
                                $(this).attr("id", $(this).attr("id").replace(currentIndex, (currentIndex - 1)));
                        });
                    }
                });
            }
            $("#tr_" + objIndex).remove();   //移除该行
            $("#hidRows").val(maxRow - 1);   //最大行减1
        }

第四步,添加一些自定义方法(如单价改变时自动计算总价)

       //根据ID获取当前所在行的位置
        function getIndexById(objId) {
            return objId.substring(objId.indexOf("_") + 1);
        }
        //单价变化时计算总价
        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 > 0)                                //判断当前是否有记录
        {
            houseList = new List<HouseAssess>();
            for (int i = 1; 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);
            }
        }
    }
时间: 2024-10-14 07:56:54

Webform动态创建删除行及后台取值的相关文章

html表格动态添加删除行(有后台操作)

<HTML> <TITLE>Form Object example</TITLE> <HEAD> <script language="javascript"> function delrow1() { var oElement=event.srcElement; while(oElement.tagName!="TR") { oElement=oElement.parentElement; } var oT

Ext.form.ComboBox 后台取值 动态加载 ext5.0.0

我用的extjs是5.0.0版本的. 开始的时候keyup事件取到的数据就是放不到ComboBox中,放全局变量也不好用.最后大神出手帮忙解决了这个问题~~~ 查看API的时候,对象没有找对,以至于方法事件都用不了. 总结出来方便查阅~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 输入号码结束--触发事件---从后台取数据---将数据放到下拉列表中 输入手机号 // 输入电话号 var $inpTel = new Ext.form.TextField({ fieldLabel: '

ASP.NET中多个相同name的控件在后台取值问题

有兽, 页面上可能有多个相同name的Html表单控件, 一般在后台使用Request.Form[“name”]取值,并用‘,’分隔. 但是当值中包含逗号时, 取值就会出现异常, 这个时候, 我们可以使用Request.Form.GetValues(“name")方法, 获取一个包含一个name值的数组.

WebForm复合控件、跨页面传值取值、C#服务端跳转页面

1.RadioButtonList     单选集合 -属性:RepeatDirection:Vertical (垂直排布)/Horizontal (横向排布) RepeatLayout:Table (表格排布方式)/Flow (span排布方式) RepeatColumns:         设置为多少列. 每一个单选按钮都是一个ListItem对象,他有  Enable(是否可用).  selected(默认选中)  Text(显示的文本) Value(隐藏的值)属性 赋值:两种数据绑定方法

后台取值+跳转

public ActionResult Login(string name, string pwd)//传进来的字符串实际没用上 { //取值 //至少有3种方法能够拿到前台Form表单submit提交过来的数据,必要条件:<input type="text" name="name"/>;;其中name是必要的 //第一种: var name1 = Request["name"]; 或 +.ToString() //第二种::前提要L

webBrowser执行js的方法,并返回值,c#后台取值

private void Form1_Load(object sender, EventArgs e) { webBrowser1.Navigate(Application.StartupPath + @"\i.html"); txtInfo.Text = webBrowser1.DocumentText; } private void button2_Click(object sender, EventArgs e) { webBrowser1.Document.InvokeScri

Select的创建,修改,取值,删除javascript代码

<!DOCTYPE html> <html> <head> <title>test</title> <meta http-equiv="content-type" content="text/html; charset=utf-8"/> </head> <body> <script> function createSelect(s_id) { var mySe

asp.net页面使用doPostBack的后台取值

前台页面(aspx文件): --伪装按钮 <span onclick='__doPostBack("lkSend","key")'>发送</span> --隐藏触发按钮 <asp:LinkButton ID="lkSend" OnClick="lkSend_Click" runat="server" Visible="false"></asp:L

form的get与post提交后台取值