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

来源:互联网 发布:windows文件夹怎么加密 编辑:程序博客网 时间:2024/05/14 23:54

/--------------------------利用计数器实现动态button的累加---------------------------------/

     在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是否存在对应数据来判断的! 废话不多说了,大家看看代码吧!

  1. private void Page_Load(object sender, System.EventArgs e) 
  2.    Button Button1 = new Button(); 
  3.    Button1.CommandArgument = "b1"
  4.    Button1.Text = "Btn1"
  5.    Button1.Command += new CommandEventHandler(this.OnButton);  
  6.    PlaceHolder1.Controls.Add(Button1);  
  7.    Button Button2 = new Button(); 
  8.    Button2.CommandArgument = "b2"
  9.    Button2.Text = "Btn2"
  10.    Button2.Command += new CommandEventHandler(this.OnButton);  
  11.    PlaceHolder1.Controls.Add(Button2);  
  12.    Control c3 = ParseControl("<asp:Button id='Button3' text='Btn3' commandname='Btn' commandargument='b3' runat='server' />");//将字符串转换成web控件 
  13.    Control c4 = ParseControl("<asp:Button id='Button4' text='Btn4' commandname='Btn' commandargument='b4' runat='server' />");  
  14.    PlaceHolder1.Controls.Add(c3);  
  15.    PlaceHolder1.Controls.Add(c4);  
  16.    Button myBut = (Button)Page.FindControl("Button3");  
  17.    myBut.Command += new CommandEventHandler(this.OnButton);  
  18.    Button myBut2 = (Button)Page.FindControl("Button4");  
  19.    myBut2.Command += new CommandEventHandler(this.OnButton); 
  20.  
  21. public void OnButton(Object Sender, CommandEventArgs e)  
  22. {  
  23.    switch (e.CommandArgument.ToString().ToLower())  
  24.    {  
  25.     case "b1":  
  26.      Label1.Text = "Button 1";  
  27.      break;  
  28.     case "b2":  
  29.      Label1.Text = "Button 2";  
  30.      break;  
  31.     case "b3":  
  32.      Label1.Text = "Button 3";  
  33.      break;  
  34.     case "b4":  
  35.      Label1.Text = "Button 4";  
  36.      break;  
  37.    };  

==========================动态添加事件===================================

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

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

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

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

具体的代码请看下面:

需要特别注意的是:

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

会执行。

  1. protected void Page_Load(object sender, EventArgs e) 
  2.     { 
  3.        //将输入字符串分析为System.Web.UI.Control对象,b为传进去的值 
  4.         Control c = ParseControl("<asp:Button Text =& nbsp;'按我' ID = 'myButton' commandargument =& nbsp;'b' runat = 'server' />"); 
  5.  
  6.         //将控件添加大Panel中 
  7.         this.Panel1.Controls.Add(c);  
  8.  
  9.         //查找页面名为myButton的控件 
  10.         Button Button = (Button)Page.FindControl("myButton");   
  11.  
  12.         //添加事件On_Button 
  13.         Button.Command += new CommandEventHandler(this.On_Button); 
  14.          
  15.     } 
  16.  
  17.     //CommandEventArgs为command事件提供数据 
  18.     protected void On_Button(Object sender,CommandEventArgs e) 
  19.     { 
  20.         Response.Write("<mce:script language = 'javascript' type ='text/javascript'><!-- 
  21. alert('" + e.CommandArgument.ToString() + "'); 
  22. // --></mce:script>"); 
  23.     } 

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

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

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

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

具体的代码请看下面:

需要特别注意的是:

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

会执行。

  1. protected void Page_Load(object sender, EventArgs e) 
  2.     { 
  3.        //将输入字符串分析为System.Web.UI.Control对象,b为传进去的值 
  4.         Control c = ParseControl("<asp:Button Text =& nbsp;'按我' ID = 'myButton' commandargument =& nbsp;'b' runat = 'server' />"); 
  5.  
  6.         //将控件添加大Panel中 
  7.         this.Panel1.Controls.Add(c);  
  8.  
  9.         //查找页面名为myButton的控件 
  10.         Button Button = (Button)Page.FindControl("myButton");   
  11.  
  12.         //添加事件On_Button 
  13.         Button.Command += new CommandEventHandler(this.On_Button); 
  14.          
  15.     } 
  16.  
  17.     //CommandEventArgs为command事件提供数据 
  18.     protected void On_Button(Object sender,CommandEventArgs e) 
  19.     { 
  20.         Response.Write("<mce:script language = 'javascript' type ='text/javascript'><!-- 
  21. alert('" + e.CommandArgument.ToString() + "'); 
  22. // --></mce:script>"); 
  23.     } 

-----------------------------asp.net 中服务器端控件动态添加事件和删除事------------------------------------------

PlaceHolder :控件容器,本身不显示,主要用来放服务器控件的,只显示其子元素(他里面的控件)

服务器控件动态添加和删除

<一>PlaceHolder  中动态添加服务器端控件

添加控件的一般方法:

声明一个新控件 如 label lb =new label()

设置控件属性   如:lb.text="text"

添加控件到 PlaceHolder 中 如: PlaceHolder1.controls.add(lb)

可以用 ViewState[AddedControl]=null 判断是不是第一次执行

动态添加控件,如果需要数据绑定,要先添加控件,然后再数据绑定,提交后(postback) 就不需要重新绑定了

new 一下就可以了,如:

  1. if ((ViewState[AddedControl] !=null) & ((bool)ViewState[AddedControl]))//第二次就不要数据绑定了 
  2.        { 
  3.            ph1.Controls.Clear();//清除ph1中的控件 
  4.            DropDownList dpl = new DropDownList(); 
  5.            dpl.ID = "controlid"
  6.            dpl.AutoPostBack = true
  7.            ph1.Controls.Add(dpl); 
  8.        } 
  9.        else  
  10.        {  
  11.           ph1.Controls.Clear(); 
  12.            DropDownList dpl = new DropDownList(); 
  13.            dpl.ID = "controlid"
  14.            dpl.AutoPostBack = true
  15.            ph1.Controls.Add(dpl); 
  16.            //链接数据库,设置数据源等 略 
  17.            dpl.DataBind(); 
  18.            ViewState[AddedControl] = true
  19.        } 

<二>panel中动态添加服务器端控件

在一个panel 中添加datagrid 并且绑定数据

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

<三> 给动态添加的控件添加事件:

如:给button 添加事件

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

这样二个按钮都对应一个函数,执行同一个事件

如果想让他们执行不同事件,

可以这样写:

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

<四>:在table中添加行和服务器端控件

在table中添加一行二列  table要转化服务器端控件

代码如下:

  1. HtmlTableRow tr1 = new HtmlTableRow();//定义行 
  2.                HtmlTableCell td1 = new HtmlTableCell();//定义列 
  3.                Label lb1 = new Label();// 定义 lb1 为Label控件 
  4.                lb1.Text = txt[m];//lb1 
  5.                td1.Controls.Add(lb1);//列中添加lbl 
  6.                HtmlTableCell td2 = new HtmlTableCell();//定义列 
  7.                TextBox txt1 = new TextBox();//textbox 
  8.                txt1.Text = namevalue[m];//text 
  9.                txt1.ID = "t" + m;//id 
  10.                td2.Controls.Add(txt1);列中添加txt1 
  11.                tr1.Cells.Add(td1);//行中添加列td1 
  12.                tr1.Cells.Add(td2);//行中添加列td1 
  13.                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')";