当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > ASP.NET 页面中动态增加的控件、添加事件

ASP.NET
FreeTextBox(版本3.1.6)在ASP.Net 2.0中使用方法
.NET 常用功能和代码小结
在 .NET Framework 2.0 中未处理的异常导致基于 ASP.NET 的应用程序意外退出
asp.net IList查询数据后格式化数据再绑定控件
asp.net sql存储过程
asp.net 简单实现禁用或启用页面中的某一类型的控件
asp.net(c#)获取内容第一张图片地址的函数
The remote procedure call failed and did not execute的解决办法
ASP.NET 在线文件管理
asp.net 读取并修改config文件实现代码
ASP.NET Cookie 操作实现
asp.net Silverlight中的模式窗体
Silverlight中动态获取Web Service地址
asp.net Silverlight应用程序中获取载体aspx页面参数
asp.net 水晶报表隔行换色实现方法
asp.net 获取Gridview隐藏列的值
手动把asp.net的类生成dll文件的方法
asp.net 使用ObjectDataSource控件在ASP.NET中实现Ajax真分页
动态指定任意类型的ObjectDataSource对象的查询参数
asp.net Md5的用法小结

ASP.NET 页面中动态增加的控件、添加事件


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-13   浏览: 161 ::
收藏到网摘: n/a

在ASP.NET中动态创建一个控件总是不那么顺利,特别是当对页面的Life Cycle不是那么了然的情况下!这里简单描述一下要求,然后提供一个解决方案,大家看看有没有更好的Idea,如果有的话就是我的大幸了,呵呵! 要求:页面上有一个Add按钮,每点击一次该按钮,页面上动态创建一个WebPartZone!
  提醒:WebPartZone只能在OnInit或之前才能创建,否则报异常!
  大家都知道,按钮的点击事件是在RaisePostbackEvent时触发的,这意味着点击事件在OnLoad阶段之后才执行,远远落后于 OnInit阶段,而且ViewState在OnLoad时才准备好,OnInit以及之前的阶段根本就不能使用ViewState!如果试图在按钮点击事件里面创建WebPartZone等控件,唯一的后果就是页面出错;而如果在OnInit里面创建控件,由于ViewState没有准备好,那么有些数据比如当前需要创建的个数(存在ViewState里面)就无法获得!
  目前对这个问题我还没有找到什么好的解决方案,经过实验,勉强得出一个不怎么优雅的方案,就是利用HiddenField保存数据,然后直接使用Request.Form["XXX"]在OnInit阶段取得数据;而判断是否点击按钮也是通过Request.Form是否存在对应数据来判断的!废话不多说了,大家看看代码吧!
复制代码 代码如下:
asp.net 中服务器端控件动态添加事件和删除事------------------------------------------
PlaceHolder :控件容器,本身不显示,主要用来放服务器控件的,只显示其子元素(他里面的控件)
服务器控件动态添加和删除
<一>PlaceHolder 中动态添加服务器端控件
添加控件的一般方法:
声明一个新控件 如 label lb =new label()
设置控件属性 如:lb.text="text"
添加控件到 PlaceHolder 中 如: PlaceHolder1.controls.add(lb)
可以用 ViewState[AddedControl]=null 判断是不是第一次执行
动态添加控件,如果需要数据绑定,要先添加控件,然后再数据绑定,提交后(postback) 就不需要重新绑定了
new 一下就可以了,如:
复制代码 代码如下:

if ((ViewState[AddedControl] != null) & ((bool)ViewState[AddedControl]))//第二次就不要数据绑定了
{
ph1.Controls.Clear();//清除ph1中的控件
DropDownList dpl = new DropDownList();
dpl.ID = "controlid";
dpl.AutoPostBack = true;
ph1.Controls.Add(dpl);
}
else
{
ph1.Controls.Clear();
DropDownList dpl = new DropDownList();
dpl.ID = "controlid";
dpl.AutoPostBack = true;
ph1.Controls.Add(dpl);
//链接数据库,设置数据源等 略
dpl.DataBind();
ViewState[AddedControl] = true;
}

<二>panel中动态添加服务器端控件
在一个panel 中添加datagrid 并且绑定数据
复制代码 代码如下:

Panel panel1 = new Panel();
panel1.Style["top"] = "200px";//设置属性
this.Controls.Add(panel1);
DataGrid dg1 = new DataGrid();//定义datagrid
BoundColumn s1 = new BoundColumn();//定义一列
s1.DataField = "first";//绑定列的数据源
s1.HeaderText = "mzi";//此列标题等属性设置
dg1.Columns.Add(s1);//加入此列
dg1.BackColor = "#00000";
dg1.CellPadding=3;
//设置 dg1的属性等
panel1.Controls.Add(dg1);

<三> 给动态添加的控件添加事件:
如:给button 添加事件
复制代码 代码如下:

//添加按钮1
Button bt1 = new Button();
bt1.CommandArgument = "bt1";//设置命令参数
bt1.Text = "daji";
bt1.Command += new CommandEventHandler(this.onbutton);//预定事件
ph1.Controls.Add(bt1);
//添加按钮2,又一种方法
Control cs = ParseControl("<asp:Button ID='Button2' runat='server' Text=Button' commandname='btn' CommandArgument = 'bt2'/>");//把字符串转化为控件
ph1.Controls.Add(cs);
Button bt2 = (Button)Page.FindControl("button2");
bt2.Command += new CommandEventHandler(this.onbutton);//给bt2添加事件
}
public void onbutton(object sender, CommandEventArgs e)
{
lab1.text = "label1";
}

这样二个按钮都对应一个函数,执行同一个事件
如果想让他们执行不同事件,
可以这样写:
复制代码 代码如下:

public void onbutton(object sender, CommandEventArgs e)
{
switch (e.CommandArgument.ToString().ToLower()) 获取命令参数,根据参数的不同,执行不同命令
{
case "bt1":lab1.text = "label1"; break;
case "bt2":lab1.text = "label2"; break;
}
}

<四>:在table中添加行和服务器端控件
在table中添加一行二列 table要转化服务器端控件
代码如下:
复制代码 代码如下:

HtmlTableRow tr1 = new HtmlTableRow();//定义行
HtmlTableCell td1 = new HtmlTableCell();//定义列
Label lb1 = new Label();// 定义 lb1 为Label控件
lb1.Text = txt[m];//lb1
td1.Controls.Add(lb1);//列中添加lbl
HtmlTableCell td2 = new HtmlTableCell();//定义列
TextBox txt1 = new TextBox();//textbox
txt1.Text = namevalue[m];//text
txt1.ID = "t" + m;//id
td2.Controls.Add(txt1);列中添加txt1
tr1.Cells.Add(td1);//行中添加列td1
tr1.Cells.Add(td2);//行中添加列td1
TABLE1.Rows.Add(tr1);//表中添加行

取得textbox中数据方法:
((TextBox)(TABLE1.Rows[m].FindControl("t" + m))).Text 第m行 id 为"t"+m的控件的值
添加html 控件,可以用 response.write("")
为服务器端控件添加客户端事件方法;
如:buttton.Attributes["onclick"] = "javascript:alert('shijain')";