(五)ASP.NET中动态生成控件
今天被问到如何在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中动态生成控件的更多相关文章
- Asp.net中使用文本框的值动态生成控件的方法
这篇文章主要介绍了Asp.net中使用文本框的值动态生成控件的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下 看到一个网友,有论坛上问及,动态的生成checkbox控件,在文本框中输入一个“花 ...
- Asp.net web form 动态生成控件的注意事项
Asp.net页面生命周期 页面初始化 Page_Init 加载View State LoadViewState 回发数据处理 LoadPostData ...
- Winforn中使用代码动态生成控件
场景 有时候需要根据配置文件在窗体中使用代码动态生成控件. 比如读取xml配置文件中的节点数量,然后在窗体中生成指定数量的RadioGroup控件. 实现 新建一个窗体,在窗体的加载完之后的事件中 p ...
- Silverlight动态生成控件实例
刚学习Silverlight,做了一个动态创建控件的实例 实现结果:根据已有的控件类名称,得到控件的实例化对象 实现思路1:就是定义一个模板文件,将类名做为参数,在silverlight中使用Srea ...
- WPF: WrapPanel 容器的数据绑定(动态生成控件、遍历)
原文:WPF: WrapPanel 容器的数据绑定(动态生成控件.遍历) 问题: 有一些CheckBox需要作为选项添加到页面上,但是数目不定.而为了方便排版,我选择用WrapPanel ...
- c# winform动态生成控件与获取动态控件输入的值
差不多有2年没有写winform程序,一直都是写bs.最近项目需要,又开始着手写一个小功能的winform程序,需要动态获取xml文件的节点个数,生成跟节点个数一样的textbox, 最后还要获取操作 ...
- Unity UGUI动态生成控件
一. 首先你得先清楚RectTransform组件的一些程序控制 1. 先得到UGUI控件上面的RectTransform组件 RectTransform rtr = gameObject.GetCo ...
- (四)动态生成控件,点击button添加控件
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 周末充电之WPF(三 ) .后台动态生成控件
布局 -连连看: 代码: private void Window_Loaded_1(object sender, RoutedEventArgs e) { //动态创建行 ; i < ; i++ ...
随机推荐
- 基于AutoCAD的空间数据共享平台雏形
好久没有更新博客了,今天先透露一个新的产品——AutoMap.我自己对于这个产品的定位是“基于AutoCAD的空间数据共享平台”.用一句话来概括AutoMap的功能:为用户提供一个在AutoCAD下访 ...
- JS 学习笔记--13---原型
练习中使用的是IE11,如果有错误之处,还请各位朋友多多指教.本文关于原型难以描述,故多用代码展示 原型是JS中一个很重要的概念,也是JS中一个难点,语言上难以描述,原型对象的属性和方法叫做原型属性和 ...
- Matlab验证公式取值范围
一.问题来源 t = 2xy/(x+y);融合相似度和信任度,我需要验证值域是不是[0,1]: 二.求解 clear all; clc; %linspace(0:1,0.1)这样是错的,第三个参数是段 ...
- 3-Highcharts 3D图之3D柱状图分组叠堆3D图
<!DOCTYPE> <html lang='en'> <head> <title>3-Highcharts 3D图之3D柱状图分组叠堆3D图</ ...
- JS 数组的基础知识
数组 一.定义 1.数组的文字定义 广义上说,数组是相同类型数据的集合.但是对于强类型语言和弱类型语言来说其特点是不一样的.强类型语言数组和集合有以下特点. 数组强类型语言:1.数组里面只能存放相同数 ...
- [百度空间] [原]MFC杂乱笔记
1. 创建动态菜单 假如ID是动态分配的,那么重载virtual BOOLOnCmdMsg(UINT,int,void*,AFX_CMDHANDLERINFO*); 据MSDN不详细解释,当第二个参数 ...
- HDU1056 HangOver
HangOver Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Descript ...
- JavaScript之表单验证讲解
JavaScript 可用来在数据被送往服务器前对 HTML 表单中的这些输入数据进行验证. JavaScript 表单验证 JavaScript 可用来在数据被送往服务器前对 HTML 表单中的这些 ...
- Linux 搭建SVN 服务器(转)
一. SVN 简介 Subversion(SVN) 是一个开源的版本控制系統, 也就是说 Subversion 管理着随时间改变的数据. 这些数据放置在一个中央资料档案库 (repository) 中 ...
- SQLite中使用时的数据类型注意
在使用SQLite时,要注意:在SQLite中的Integer类型,对应在C#中需要使用long类型或者Int64 在使用SQLite时,要注意:在SQLite中存放的日期类型必须是如此:yyyy-M ...