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

  要求:页面上有一个Add按钮,每点击一次该按钮,页面上动态创建一个WebPartZone!

  提醒:WebPartZone只能在OnInit或之前才能创建,否则报异常!

  大家都知道,按钮的点击事件是在RaisePostbackEvent时触发的,这意味着点击事件在OnLoad阶段之后才执行,远远落后于 OnInit阶段,而且ViewState在OnLoad时才准备好,OnInit以及之前的阶段根本就不能使用ViewState!如果试图在按钮点击事件里面创建WebPartZone等控件,唯一的后果就是页面出错;而如果在OnInit里面创建控件,由于ViewState没有准备好,那么有些数据比如当前需要创建的个数(存在ViewState里面)就无法获得!

  目前对这个问题我还没有找到什么好的解决方案,经过实验,勉强得出一个不怎么优雅的方案,就是利用HiddenField保存数据,然后直接使用Request.Form["XXX"]在OnInit阶段取得数据;而判断是否点击按钮也是通过Request.Form是否存在对应数据来判断的!废话不多说了,大家看看代码吧!

  

复制代码 代码如下:

  private void Page_Load(object sender, System.EventArgs e)

  {

  Button Button1 = new Button();

  Button1.CommandArgument = "b1";

  Button1.Text = "Btn1";

  Button1.Command += new CommandEventHandler(this.OnButton);

  PlaceHolder1.Controls.Add(Button1);

  Button Button2 = new Button();

  Button2.CommandArgument = "b2";

  Button2.Text = "Btn2";

  Button2.Command += new CommandEventHandler(this.OnButton);

  PlaceHolder1.Controls.Add(Button2);

  Control c3 = ParseControl("<asp:Button id='Button3' text='Btn3' commandname='Btn' commandargument='b3' runat='server' />"); //将字符串转换成web控件

  Control c4 = ParseControl("<asp:Button id='Button4' text='Btn4' commandname='Btn' commandargument='b4' runat='server' />");

  PlaceHolder1.Controls.Add(c3);

  PlaceHolder1.Controls.Add(c4);

  Button myBut = (Button)Page.FindControl("Button3");

  myBut.Command += new CommandEventHandler(this.OnButton);

  Button myBut2 = (Button)Page.FindControl("Button4");

  myBut2.Command += new CommandEventHandler(this.OnButton);

  }

  public void OnButton(Object Sender, CommandEventArgs e)

  {

  switch (e.CommandArgument.ToString().ToLower())

  {

  case "b1":

  Label1.Text = "Button 1";

  break;

  case "b2":

  Label1.Text = "Button 2";

  break;

  case "b3":

  Label1.Text = "Button 3";

  break;

  case "b4":

  Label1.Text = "Button 4";

  break;

  };

  }

  asp.net为控件动态添加事件

  实现的功能是在网页上的Panel中动态添加一个Button,并为这个Button写一个单击事件。

  动态添加控件的事件,语句:

  

复制代码 代码如下:

  Control.Command += new CommandEventHandler(this.EventFun);

  具体的代码请看下面:

  需要特别注意的是:

  添加控件和给控件加事件时绝对不能放到 if(!IsPostback){}里面,那样的话,点击一次后控件会消失,而且事件也不

  会执行。

  

复制代码 代码如下:

  protected void Page_Load(object sender, EventArgs e)

  {

  //将输入字符串分析为System.Web.UI.Control对象,b为传进去的值

  Control c = ParseControl("<asp:Button Text = '按我' ID = 'myButton' commandargument = 'b' runat = 'server' />");

  //将控件添加大Panel中

  this.Panel1.Controls.Add(c);

  //查找页面名为myButton的控件

  Button Button = (Button)Page.FindControl("myButton");

  //添加事件On_Button

  Button.Command += new CommandEventHandler(this.On_Button);

  }

  //CommandEventArgs为command事件提供数据

  protected void On_Button(Object sender,CommandEventArgs e)

  {

  Response.Write("<script language = 'javascript' type = 'text/javascript'><!--

  alert('" + e.CommandArgument.ToString() + "');

  // --></script>");

  }

  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')";