最近跟老师做一个 web 项目,可我自己又不太懂 js ,所以一直为动态建立表格并且能动态的取值和赋值感到苦恼。起初在网上找到了一些 js 资源,解决了动态添加和取值的问题,可是给表中控件灵活的赋值又成了一个问题。于是乎我又回过头来利用 ASP.NET 的 TABLE 控件,容易赋值且容易取值,但是有一个问题就是,ASP.NET页面每次触发页面都会刷新一次,则我动态建立的表格就会在页面刷新后不见了,而这时若在后台取值就会出现“使用了未实例化对象”的错误,致使无法取到动态添加的行中的内容。

为此苦恼了很久,发现动态建立表格并不难,但是要保证每次postback的时候都要同步记下Table的状态,这样为页面中 table 动态添加内容或取值就不会出现问题了。虽然基本问题解决了,可是每次动态的添加行或是删除行,页面还是会刷新,看起来感觉不是很好。这个当然是可以解决的,只要把 Table 和相关按钮放在 AJAX Extensions 提供的 UpdatePanel 控件里就可以,这样对Table操作只会引起 UpdatePanel 内的局部刷新,而页面就不会有闪动的效果了。但是要注意的是利用 ASP.NET 的AJAX 要记得在页面中添加 ScriptManager 控件,并且 ScriptManager 要放在其他AJAX提供的控件之前。

一、页面中table对应位置的html代码,按下“添加成员”按钮就会动态添加一行,按下“删除”就会删除一行,而本例的删除默认是每次都删除表的最后一行

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:Table ID="tableDivide" runat="server" CaptionAlign="Bottom"
CellPadding="2" CellSpacing="2" HorizontalAlign="Center" Width="750px">
</asp:Table>
<div ID="divDivBT" runat="server" style="width: 368px; height: 27px" visible="false">
<asp:Button ID="btAddRow" runat="server" OnClick="btAddRow_Click" Text="添加成员" />
<asp:Button ID="btDelRow" runat="server" OnClick="btDelRow_Click" Text="删除" Width="65px" />
</div>
<br />
</ContentTemplate>
</asp:UpdatePanel>

二、后台添加行的代码

用ViewState["count"]记下table的行数,如果ViewState["count"]==null表明添加的是表格的第一行,着动态生成一个提交按钮以便取值

//按下添加成员按钮触发该事件
protected void btAddRow_Click(object sender, EventArgs e)
{
addRows(table1);
if (ViewState["count"] == null) addbutton();
ViewState["count"] = Convert.ToInt16(ViewState["count"]) + ; }

假设table中有两列,一列是TextBox一列是DropDownList,这是一个添加行的函数

 //给表table1添加一行
private void addRows(Table table)
{
TableRow tr = new TableRow();
TableCell tc1 = new TableCell();
TextBox t = new TextBox();
t.ID = "tb" + table1.Rows.Count;
tc1.Controls.Add(t);
TableCell tc2 = new TableCell();
DropDownList dpl = new DropDownList();
dpl.ID = "dpl" + table1.Rows.Count;
for (int i = ; i < ; i++) dpl.Items.Add(i.ToString());
tc2.Controls.Add(dpl);
tr.Cells.Add(tc1);
tr.Cells.Add(tc2);
table.Rows.Add(tr);
}

在添加表格第一行的时候动态添加一个取值按钮,并且为该按钮新建一个Click事件btn_click以取得表格中的值

//添加一个提交的按钮控件
private void addbutton()
{
Button b = new Button();
b.ID = "btn";
b.Text = "取值";
b.Click += new System.EventHandler(btn_click);//添加按钮事件
placeholder1.Controls.Add(b);
}
//取值
private void btn_click(object sender, System.EventArgs e)
{
for (int i = ; i < table1.Rows.Count; i++)
{
Response.Write(((TextBox)table1.Rows[i].FindControl("tb" + i)).Text + ((DropDownList)table1.Rows[i].FindControl("dpl" + i)).SelectedValue + "<br>");
}
}

删除按钮事件,总是默认删除表的最后一行

 protected void btDelRow_Click(object sender, EventArgs e)
{
table1.Rows.RemoveAt(table1.Rows.Count-1);
ViewState["count"] = Convert.ToInt16(ViewState["count"]) - 1;
}

最后也是最重要的地方,移动要在Page_Load中记下表的状态。注意不要添加if(!ispostback){},相反你倒可以添加if(ispostback),因为页面第一次加载不可能已经按下按钮了。 这是要在每次页面刷新的时候同时要保留之前表格的状态,而ViewState可以很好的记录表格动态行数

 protected void Page_Load(object sender, EventArgs e)
{
if (ViewState["count"] != null)
{
//每次刷新都重新建立表格循环再次添加行
for (int i = ; i < Convert.ToInt16(ViewState["count"]); i++)
addRows(table1);
addbutton();
} }

ASP.NET给Table动态添加删除行,并且得到控件的值的更多相关文章

  1. asp.net 动态添加多个用户控件

    动态添加多个相同用户控件,并使每个用户控件获取不同的内容. 用户控件代码: 代码WebControls using System; using System.Collections.Generic;  ...

  2. Android 在程序中动态添加 View 布局或控件

    有时我们需要在程序中动态添加布局或控件等,下面用程序来展示一下相应的方法: 1.addView 添加View到布局容器 2.removeView 在布局容器中删掉已有的View 3.LayoutPar ...

  3. (转载)VC/MFC 工具栏上动态添加组合框等控件的方法

    引言 工具条作为大多数标准的Windows应用程序的 一个重要组成部分,使其成为促进人机界面友好的一个重要工具.通过工具条极大方便了用户对程序的操作,但是在由Microsoft Visual C++开 ...

  4. VC/MFC 工具栏上动态添加组合框等控件的方法

    引言 工具条作为大多数标准的Windows应用程序的一个重要组成部分,使其成为促进人机界面友好的一个重要工具.通过工具条极大方便了用户对程序的操作,但是在由Microsoft Visual C++开发 ...

  5. winform PictureBox图片上动态添加Label或其他控件

    效果图: 代码: //分页或者多次加载时,需要删除之前产生的lable等控件 ; tabID < ; tabID++) { foreach (Control control in this.ta ...

  6. ASP.NET给前端动态添加修改 CSS样式JS 标题 关键字

    有很多网站读者能换自己喜欢的样式,还有一些网站想多站点共享后端代码而只动前段样式,可以采用动态替换CSS样式和JS. 如果是webform 开发,可以用下列方法: 流程是首先从数据中或者xml读取数据 ...

  7. Js实现Table动态添加一行的小例子

    <form id="form1" runat="server"> <div> <table id=" style=&qu ...

  8. ASP.NET给前端动态添加修改 CSS样式JS 标题 关键字(转载)

    原文地址:http://www.cnblogs.com/xbhp/p/6392225.html 有很多网站读者能换自己喜欢的样式,还有一些网站想多站点共享后端代码而只动前段样式,可以采用动态替换CSS ...

  9. asp.net动态加载ascx用户控件

    原文:asp.net动态加载ascx用户控件 在主aspx/ascx文件中,将目标ascx1,ascx2控件拖拉到其页面中,然后删除,目的是要生成:Register 代码,然后在主文件中定义DIV或T ...

随机推荐

  1. SharePoint 2010以其他用户身份登录的弹出代码

    在SharePoint 2010平台中,可以在当前用户登录系统的情况下使用其他用户身份登录,以达到在同一浏览器中切换用户身份的目的. 每个用户登录SharePoint系统之后都会在系统右上角将用户的名 ...

  2. Sql缓存依赖--数据库缓存

    •依赖于文件内容CacheDependency cDep = new CacheDependency(filePath); •依赖于数据库内容(轮询机制/通知机制)一:轮询机制 1.在数据库新建版本表 ...

  3. css两列布局,一边固定宽度,另一边自适应

    <!DOCTYPE HTML><HTML>    <head>                <meta charset="utf-8" ...

  4. Spring data redis的一个bug

    起因 前两天上线了一个新功能,导致线上业务的缓存总是无法更新,报错也是非常奇怪,redis.clients.jedis.exceptions.JedisConnectionException: Unk ...

  5. JavaSE学习总结第24天_多线程2

      24.01  JDK5之后的Lock锁的概述和使用 虽然我们可以理解同步代码块和同步方法的锁对象问题,但是我们并没有直接看到在哪里加上了锁,在哪里释放了锁,为了更清晰的表达如何加锁和释放锁,JDK ...

  6. Myeclipse代码提示及如何设置自动提示

    Myeclipse代码提示及如何设置自动提示 (2011-11-18 00:38:41) 转载▼ 标签: 杂谈 分类: Java 1. 设置代码自动提示window --> preference ...

  7. document.domain与js跨域的问题

    以前如果要使iframe里面的脚本能访问parent的内容,但iframe和parent的二级域名相同,那一般都会在两者都写上document.domain="xxx.com" 以 ...

  8. @RequestParam

    @MVC另外一个特性是其提取和解析请求参数的能力.让我们继续重构上面的方法,并在其中添加@RequestParam注解: @RequestMapping("/accounts/show&qu ...

  9. MyEclipse2014不支持jre1.8吗

    myeclipse 2015才支持了java 8 也可以用Eclipse Kepler加插件的形式来支持java 8

  10. 图的BFS代码

    图是严蔚敏书上P168的图, 图的邻接表存储,DFS可以看以前写的文章:http://www.cnblogs.com/youxin/archive/2012/07/28/2613362.html ]; ...