今天被问到如何在ASP.NET 页面中动态创建一批控件,并且希望在后续代码中能访问到这些动态创建的控件。我用下面的例子来解释这个问题

=================================================================================

页面文件:

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Button ID="createbutton" runat="server" Text="批量创建按钮"
onclick="createbutton_Click" /><asp:Button ID="displaybutton"
runat="server" Text="显示动态按钮的信息" onclick="displaybutton_Click"/>
<asp:Table ID="HolderTable" runat="server"></asp:Table>
</div>
</form>
</body>
</html>

----上面的Table是用来存放动态控件的,用Table是因为它有行和列的概念,更易于布局设计。除了Table之外,还可以使用PlaceHolder控件或者Panel控件

代码文件:

public partial class _Default : System.Web.UI.Page
{ protected override void OnLoad(EventArgs e)
{
CreateControl();
} protected void createbutton_Click(object sender, EventArgs e)
{
if (ViewState["CreateControl"] == null)
{
ViewState["CreateControl"] = true;
CreateControl();
}
} void CreateControl() {
///批量创建100个按钮
/// if (ViewState["CreateControl"]==null) return; //第一次的时候应该不要创建这些控件 for (int x = ; x < ; x++)
{
TableRow row = new TableRow();
for (int y = ; y < ; y++)
{
TableCell cell = new TableCell(); Button bt = new Button();
bt.Text = string.Format(" x={0},y={1} ", x, y);
bt.Click += new EventHandler(bt_Click);
cell.Controls.Add(bt); row.Cells.Add(cell);
} HolderTable.Rows.Add(row);
}
} void bt_Click(object sender, EventArgs e)
{
Trace.Write("控件动态事件");
((Button)sender).BackColor = System.Drawing.Color.Red;
Response.Write(string.Format("你点击了该按钮:{0}", ((Button)sender).Text));
} /// <summary>
/// 显示动态创建的控件的信息
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void displaybutton_Click(object sender, EventArgs e)
{
for (int x = ; x < ; x++)
{
TableRow row = HolderTable.Rows[x];
for (int y = ; y < ; y++)
{
Button bt = (Button)row.Cells[y].Controls[];
Response.Write(bt.Text);
}
}
}
}

----这里的关键点在于,必须在Page_Load事件中每次都调用创建控件的代码。这与我们一般的理解是不一样的。

1. 首先讲为什么要?因为这些控件是动态添加的,在页面的源文件中并没有。所以PostBack回来之后重新构建页面时,非得再次创建。

2. 这样做难道不会重复创建吗?不会,因为每次都重新构建了,其实原先的控件都消失了。

3. 那么,重新构建之后控件的状态怎么保存的?这是通过ViewState自动保存的。

--在动态创建控件的页面上,如果禁用ViewState,将使得页面失去作用

测试效果:

1. 第一次打开页面时

2。点击“批量创建按钮”后

3. 点击“显示动态按钮的信息”后

4. 点击下面100个按钮中任意一个之后

【注意】

动态创建控件的行为也可以移动到用户控件里面。上述代码不需要任何改动即可实现。

原出处:http://www.cnblogs.com/chenxizhang/archive/2009/05/19/1460544.html

(五)ASP.NET中动态生成控件的更多相关文章

  1. Asp.net中使用文本框的值动态生成控件的方法

    这篇文章主要介绍了Asp.net中使用文本框的值动态生成控件的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下 看到一个网友,有论坛上问及,动态的生成checkbox控件,在文本框中输入一个“花 ...

  2. Asp.net web form 动态生成控件的注意事项

    Asp.net页面生命周期 页面初始化          Page_Init   加载View State      LoadViewState    回发数据处理      LoadPostData ...

  3. Winforn中使用代码动态生成控件

    场景 有时候需要根据配置文件在窗体中使用代码动态生成控件. 比如读取xml配置文件中的节点数量,然后在窗体中生成指定数量的RadioGroup控件. 实现 新建一个窗体,在窗体的加载完之后的事件中 p ...

  4. Silverlight动态生成控件实例

    刚学习Silverlight,做了一个动态创建控件的实例 实现结果:根据已有的控件类名称,得到控件的实例化对象 实现思路1:就是定义一个模板文件,将类名做为参数,在silverlight中使用Srea ...

  5. WPF: WrapPanel 容器的数据绑定(动态生成控件、遍历)

    原文:WPF: WrapPanel 容器的数据绑定(动态生成控件.遍历) 问题:        有一些CheckBox需要作为选项添加到页面上,但是数目不定.而为了方便排版,我选择用WrapPanel ...

  6. c# winform动态生成控件与获取动态控件输入的值

    差不多有2年没有写winform程序,一直都是写bs.最近项目需要,又开始着手写一个小功能的winform程序,需要动态获取xml文件的节点个数,生成跟节点个数一样的textbox, 最后还要获取操作 ...

  7. Unity UGUI动态生成控件

    一. 首先你得先清楚RectTransform组件的一些程序控制 1. 先得到UGUI控件上面的RectTransform组件 RectTransform rtr = gameObject.GetCo ...

  8. (四)动态生成控件,点击button添加控件

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. 周末充电之WPF(三 ) .后台动态生成控件

    布局 -连连看: 代码: private void Window_Loaded_1(object sender, RoutedEventArgs e) { //动态创建行 ; i < ; i++ ...

随机推荐

  1. python 单元测试-unittest

    参考资料:https://docs.python.org/3.4/library/unittest.html#module-unittest 一张图解决问题: 涉及5块内容:case.suite.lo ...

  2. php 设计API之优化 记

    服务器端 可以考虑使用rest实现,清晰url:put http://aa.com/news 客户端 curl实现muliti机制,实现多线程并发,节省多接口调用的时间 curl实现keepalive ...

  3. bzoj 1041 圆上的整点 分类: Brush Mode 2014-11-11 20:15 80人阅读 评论(0) 收藏

    这里先只考虑x,y都大于0的情况 如果x^2+y^2=r^2,则(r-x)(r+x)=y*y 令d=gcd(r-x,r+x),r-x=d*u^2,r+x=d*v^2,显然有gcd(u,v)=1且u&l ...

  4. myeclipse 反编译插件 jad 安装

    1.  准备工作 下载jad.exe文件:http://www.varaneckas.com/sites/default/files/jad/jad158g.win.zip 下载jadeclipse插 ...

  5. Topcoder SRM 630div 2

    A:不断的消除两个相邻的相等字符,简单题. 真心不习惯STL.. #include<iostream> #include <string> #include <vecto ...

  6. 在字符串S1中删除字符串S2中所包含的字符

    /************************************************************************* > File Name: test.c &g ...

  7. WIN7设置wifi热点的方法

    1.以管理员身份运行命令提示符:快捷键win+R→输入cmd→回车2.启用并设定虚拟WiFi网卡:运行命令:netsh wlan set hostednetwork mode=allow ssid=m ...

  8. 【译】C++工程师需要掌握的10个C++11特性

    原文标题:Ten C++11 Features Every C++ Developer Should Use 原文作者:Marius Bancila 原文地址:codeproject 备注:非直译,带 ...

  9. HDU 4027 Can you answer these queries?(线段树,区间更新,区间查询)

    题目 线段树 简单题意: 区间(单点?)更新,区间求和  更新是区间内的数开根号并向下取整 这道题不用延迟操作 //注意: //1:查询时的区间端点可能前面的比后面的大: //2:优化:因为每次更新都 ...

  10. 使用angular.js开发的一个简易todo demo

    前沿 在CVTE实习考察的一周里,接触到了angular,并在最后的一天任务里要求使用angular做一个功能主要包括创建.编辑.恢复.删除以及留言的todo demo,并支持响应式布局.因为之前没怎 ...