动态创建的按钮button的单击Click事件怎么不执行?
日期:2006-12-24 荐:
动态创建的按钮button的单击Click事件怎么不执行?我循环创建了N个button,并为每个button添加了Click事件,编译能通过,可是每次运行,单击按钮进度,总是不能运行这个单击事件?大体代码如下 :private void page_load(object sender,system.eventargs e){ if(!this.page.ispostback) { CreateButton() }}private void CreaateButton(){ int i=0; for(int k=0;k<count;k ) { Button b=new button(); b.id=button i.tostring(); i ; b.click =new ClickHandler(button_Click); HTMLfrom form=(HtmlForm)this.findcontrol("main"); form.controls.add(b); }}private void btnxm_Click(object sender, system.eventargs e){ .......... response.redirct("next.aspx");}怎么没有人啦??动态创建的控件因为web是不连续的,要求每次近来的时候都再帮顶事件private void Page_Load(object sender, System.EventArgs e){// 在此处放置用户代码以初始化页面if(!this.Page.IsPostBack){}CreateButton() ;}楼主的代码改的好累啊,大小写不分,空格也没有详细代码using System;using System.Collections;using System.ComponentModel;using System.Data;using System.Drawing;using System.Web;using System.Web.SessionState;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.HtmlControls;namespace PaladinWebApplication.MyTest{/// <summary>/// WebForm1 的摘要说明。/// </summary>public class WebForm1 : System.Web.UI.Page{private void Page_Load(object sender, System.EventArgs e){// 在此处放置用户代码以初始化页面if(!this.Page.IsPostBack){}CreateButton() ;}#region Web 窗体设计器生成的代码override protected void OnInit(EventArgs e){//// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。//InitializeComponent();base.OnInit(e);}/// <summary>/// 设计器支持所需的方法 - 不要使用代码编辑器修改/// 此方法的内容。/// </summary>private void InitializeComponent(){ this.Load = new System.EventHandler(this.Page_Load);}#endregionprivate void CreateButton(){int i=0;for(int k=0;k<1;k ){Button b=new Button();b.ID= "button" i.ToString();b.Text = "test" ;i ;b.Click =new System.EventHandler(this.button_Click);HtmlForm form=(HtmlForm)this.FindControl("main");form.Controls.Add(b);}}private void button_Click(object sender, System.EventArgs e){setMessage( "successfully" ) ;}public static void setMessage(string strMessage) { System.Web.HttpContext.Current.Response.Write("<script language=javascript>alert('" strMessage "')</script>");}}}b.click =new ClickHandler(button_Click); HTMLfrom form=(HtmlForm)this.findcontrol("main"); form.controls.add(b); }}private void btnxm_Click(object .............这里,明显的两个事件名称都不一样...btnxm_Click与button_Click我是拷贝的,没有仔细看啦,反正我编译是通过的了,就是运行后的事情了!System.NullReferenceException: 未将对象引用设置到对象的实例。 -----form.Controls.Add(b);?????????????????HtmlForm form=(HtmlForm)this.FindControl("main");form.Controls.Add(b);这个我可以直接用HTMLTable吧???是的!由于放在 ispostback 判断里,当页面再次装载时那些按钮对象都不存在,没有被重建,事件自然不会发生。即使重建,其实也要保证 clientID一致,只不过一般人写的程序比较简单,.net自动生成的clientID大多数情况下是一致的,所以不太在意编程时对控件的ID进行设置。直接引用main(HTMLForm)是可以的,但是要看一下对应的.cs文件中的控件声明,如果没有声明 main 变量就手动声明。vs.net好像不声明这个变量,好奇怪!添加一组自定义控件,最好在界面上放一个 spaceholder ,然后把控件装在这里边。当用RAD重新布局时只要拖动这个容器就可以把整组控件改变位置,不需要去到代码中去修改。谢谢又出现一个新的问题,就是不用Ispostback的话,完成其它功能也会再重新创建控件了,这怎么处理呢?倒!还没有解决啊private void Page_Load(object sender, System.EventArgs e){if(Page.IsPostBack){if(ViewState["IsLoadTextBox"]!=null){Add();}}}private void Button1_Click(object sender, System.EventArgs e){if(ViewState["IsLoadTextBox"]==null){Add();ViewState["IsLoadTextBox"]=1;}}private void Add(){TableRow r = new TableRow();TableCell c=new TableCell();HtmlInputFile t=new HtmlInputFile();t.ID="tbfile";c.Controls.Add(t);r.Cells.Add(c);this.Table1.Rows.Add(r);}}http://community.csdn.net/Expert/topic/3939/3939259.xml?temp=9.405154E-02
http://community.csdn.net/Expert/topic/3939/3939765.xml?temp=.3935205http://www.cnblogs.com/lovecherry/archive/2005/04/09/134543.html楼上说的有道理,我的功能可以实现,处理的不好动态创建控件的最佳时机OnInithttp://blog.joycode.com/saucer/archive/2004/10/21/36124.aspxto dongweicq() :重复创建控件了吗?奇怪。可能是c#和vb.net编译出来的页面机制不同。在 vb.net中页面时不会记住动态创建的控件的。我去年之前在公司里是用c#的,不过我现在已经把c#差不多忘记啦!你在page的load事件的最后那个}设置断点,然后在命令窗口打印?(HtmlForm)this.findcontrol("main").controls看看页面第一次和第二次提交时的结果是否一样,如果不一样,继续察看controls集合里边的每一个元素。我今天刚发觉,很多朋友不怎么使用调试器去自己分析内存变量和堆栈!这样很多问题就比较难以说清楚,回答起来很累了。我们也是一边调试一边查找原因的,没有谁向老中医一样查验观色就胆敢下猛药。我觉得可以把 button 做成全局的不就可以了, 何苦每次PageLoad 都去产生一次?你只需要在PageLoad 中做的就是 Controls.Add().b.click =new ClickHandler(button_Click);这里有问题了。难道你的每个按钮都执行一个函数?-------->//new ClickHandler(button i _Click);应该是这里的问题建议直接用按钮数组:private void CreaateButton(){ int i=0; Button b[]=new Button[count]; for(int k=0;k<count;k ) { Button b[k]=new button(); b[k].id="button" k.tostring(); k ; b[k].click=new ClickHandler(button_Click); HTMLfrom form=(HtmlForm)this.findcontrol("main"); form.controls.add(b[k]); }}如下代码测试通过,大家看看有什么不妥 .偶只是一个小三角的菜鸟-_-!!using System;using System.Collections;using System.ComponentModel;using System.Data;using System.Drawing;using System.Web;using System.Web.SessionState;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.HtmlControls;namespace WebApplication1{/// <summary>/// WebForm1 的摘要说明。/// </summary>/// public class ButtonClass{public static int btCount=10;public static Button[] btC=new Button[btCount];public static void bt_Click(object sender, EventArgs e){ Button Temp=(Button)sender;Temp.Page.Response.Write("Hello");}}public class WebForm1 : System.Web.UI.Page{private void Page_Load(object sender, System.EventArgs e){if (!IsPostBack){CreateButton();};AddButton("Form1");}private void CreateButton(){for(int k=0;k<ButtonClass.btCount;k ){Button bt=new Button(); bt.ID="button" k.ToString(); bt.Text=k.ToString();bt.Click =new EventHandler(ButtonClass.bt_Click);ButtonClass.btC[k]=bt;}}private void AddButton(string containerId){HtmlForm myForm=(HtmlForm)this.FindControl(containerId);for(int i=0;i<ButtonClass.btCount;i ){myForm.Controls.Add(ButtonClass.btC[i]);}}#region Web 窗体设计器生成的代码override protected void OnInit(EventArgs e){//// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。//InitializeComponent();base.OnInit(e);}/// <summary>/// 设计器支持所需的方法 - 不要使用代码编辑器修改/// 此方法的内容。/// </summary>private void InitializeComponent(){ this.Load = new System.EventHandler(this.Page_Load);}#endregion}}我想缺陷是 付出了N个Button的内存..........====>"b.click =new ClickHandler(button_Click);这里有问题了。难道你的每个按钮都执行一个函数?"这个不是问题哈,可以通过button 的ID不同写个switch 处理嘛。哥们来看看这么写吧!用按钮数组:简单使用可读,呵呵!我初学private void CreaateButton(){ int i=0; Button b[]=new Button[count]; for(int k=0;k<count;k ) { Button b[k]=new button(); b[k].id="button" k.tostring(); k ; b[k].click=new ClickHandler(button_Click); HTMLfrom form=(HtmlForm)this.findcontrol("main"); form.controls.add(b[k]); }}
标签: