高手来看~~动态生成的控件如何加载事件?

wdf618 2008-12-08 10:11:26
想做一个简单的功能
点击Button1动态生成一个Button2(Button2是不存在的,是动态生成的,回传后会消失),点击Button2能运行服务器端的一段代码,要求:Button2的onclick事件代码不写在js中,回传后button2还在。

代码:

public partial class Default3 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{

}
protected void Button1_Click(object sender, EventArgs e)
{
Button L_Button = new Button();
L_Button.ID = "Button2";
L_Button.Text = "输出";
L_Button.Attributes.Add("runat", "server");
L_Button.BackColor = System.Drawing.Color.Blue;
L_Button.ForeColor = System.Drawing.Color.Wheat;
L_Button.Click += new EventHandler(this.CCC);//这句话我试着写的,发觉无效
Panel1.Controls.Add(L_Button);

}
protected void CCC(object sender, EventArgs e)
{
Response.Write("XXX");
}
}

我是希望点击button2能够运行CCC方法,该怎么写?
这个我可以利用ajax做
写个

L_Button.Attributes.Add("OnClick","Button2_Click");

然后在前台写一个

function Button2_Click()
{
//调用ajax引擎,执行CCC函数
...
}

但是我现在想要不借助js和ajax不知该如何实现~~
请各位高手支招!
...全文
98 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
lovehongyun 2008-12-09
  • 打赏
  • 举报
回复
我没测,你自己试试.

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class Default9 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)
{
if (ViewState["flag"] != null)
{
this.form1.Controls.Add(Build_Button());
}

}
}
protected void Button1_Click(object sender, EventArgs e)
{
if (ViewState["flag"] == null)
{
this.form1.Controls.Add(Build_Button());
ViewState["flag"] = true;
}
}

void L_Button_Click(object sender, EventArgs e)
{
Response.Write("dd");
}

Button Build_Button()
{
Button L_Button = new Button();
L_Button.ID = "Button2";
L_Button.Text = "输出";
L_Button.Attributes.Add("runat", "server");
L_Button.BackColor = System.Drawing.Color.Blue;
L_Button.ForeColor = System.Drawing.Color.Wheat;
L_Button.Click += new EventHandler(L_Button_Click);
return L_Button;
}

}
wdf618 2008-12-09
  • 打赏
  • 举报
回复
感谢 lovehongyun ,现在我把代码改成了这样

protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)
{

Panel1.Controls.Add(Build_Button());

}
}

protected void Button1_Click(object sender, EventArgs e)
{
Panel1.Controls.Add(Build_Button());
}

protected Button Build_Button()
{
Button L_Button = new Button();
L_Button.ID = "Button_2";
L_Button.Text = "输出";
L_Button.Attributes.Add("runat", "server");
L_Button.BackColor = System.Drawing.Color.Blue;
L_Button.ForeColor = System.Drawing.Color.Wheat;
//Response.Write("<SCRIPT> function DDD() {alert('XXXX');} </SCRIPT>");
//L_Button.Attributes.Add("OnClick", "DDD()");
L_Button.Click += new EventHandler(L_Button_Click);
return (L_Button);
}

protected void L_Button_Click(object sender, EventArgs e)
{
Response.Write("XXX");
}


现在的问题是我希望点击了Button1之后才出现这个动态加载的[输出]按钮,但是如我上面这样写任何回传都会加载这个按钮,并且点击Button1时会出现两个[输出]按钮
我想到的解决方法是在

protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)
{
if([输出]按钮不存在)
{
Panel1.Controls.Add(Build_Button());
}

}
}


现在的问题是怎么判断该按钮不存在呢?我试着用request.form[],但是按钮不被包含在表单内提交,除非是它自身被点击的时候。
一个解决办法是可以用session存一个变量来指示,但是有没有别的办法可以直接获取浏览器端该按钮的状态呢(比方说能让form每次都提交该按钮的text,如果取不到说明该按钮不存在)?
ReyZhang 2008-12-09
  • 打赏
  • 举报
回复
顶ls ,因为是动态创建控件,并给控件注册事件,要保证页面每次刷新时都能加载到此控件的创建

放到 if (IsPostBack) 中去执行
lovehongyun 2008-12-09
  • 打赏
  • 举报
回复
如果你要动态生成控件,就要保证每次加载都要执行生成控件的动作,否则会刷没的.
lovehongyun 2008-12-09
  • 打赏
  • 举报
回复

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class Default9 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)
{
Button L_Button = new Button();
L_Button.ID = "Button2";
L_Button.Text = "输出";
L_Button.Attributes.Add("runat", "server");
L_Button.BackColor = System.Drawing.Color.Blue;
L_Button.ForeColor = System.Drawing.Color.Wheat;
L_Button.Click += new EventHandler(L_Button_Click);
this.form1.Controls.Add(L_Button);
}
}
protected void Button1_Click(object sender, EventArgs e)
{

}

void L_Button_Click(object sender, EventArgs e)
{
Response.Write("dd");
}
}
皮皮鲁是 2008-12-09
  • 打赏
  • 举报
回复
学习了 帮你顶
wdf618 2008-12-09
  • 打赏
  • 举报
回复
没人知道么?!!!
cong1212 2008-12-09
  • 打赏
  • 举报
回复
以前我也做过,这样做就是反复加载Button,其实这里你可以在动态生成Button时后就把button保持到Session里,再在Load里取出加载事件,这样就可以不用反复加载了.跟你上面的比各有优越性
wdf618 2008-12-09
  • 打赏
  • 举报
回复
这里使用ViewState比Session更好~~受教了!
下面是我经过测试了的代码:

protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
//Session["Button_2_Exist"] = false;//用来指示其他控件的回传是否创建该按钮
ViewState["Button_2_Exist"] = false;
}
if (IsPostBack)
{
if (Request.Form["Button1"] == null)//用来指示button1引发的回传是否创建该按钮
{
if ((bool)ViewState["Button_2_Exist"])
{
Panel1.Controls.Add(Build_Button());
}
}
}
}

protected void Button1_Click(object sender, EventArgs e)
{
if (!(bool)ViewState["Button_2_Exist"])
{
Panel1.Controls.Add(Build_Button());
ViewState["Button_2_Exist"] = true;
}
else
{
ViewState["Button_2_Exist"] = false;
}
}

protected Button Build_Button()
{
Button L_Button = new Button();
L_Button.ID = "Button_2";
L_Button.Text = "输出";
L_Button.Attributes.Add("runat", "server");
L_Button.BackColor = System.Drawing.Color.Blue;
L_Button.ForeColor = System.Drawing.Color.Wheat;
//Response.Write("<SCRIPT> function DDD() {alert('XXXX');} </SCRIPT>");
//L_Button.Attributes.Add("OnClick", "DDD()");
L_Button.Click += new EventHandler(L_Button_Click);
return (L_Button);
}

protected void L_Button_Click(object sender, EventArgs e)
{
Response.Write("XXX");
}

wdf618 2008-12-09
  • 打赏
  • 举报
回复
这里使用ViewState比Session更好~~受教了!
下面是我经过测试了的代码:

protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
//Session["Button_2_Exist"] = false;//用来指示其他控件的回传是否创建该按钮
ViewState["Button_2_Exist"] = false;
}
if (IsPostBack)
{
if (Request.Form["Button1"] == null)//用来指示button1引发的回传是否创建该按钮
{
if ((bool)ViewState["Button_2_Exist"])
{
Panel1.Controls.Add(Build_Button());
}
}
}
}

protected void Button1_Click(object sender, EventArgs e)
{
if (!(bool)ViewState["Button_2_Exist"])
{
Panel1.Controls.Add(Build_Button());
ViewState["Button_2_Exist"] = true;
}
else
{
ViewState["Button_2_Exist"] = false;
}
}

protected Button Build_Button()
{
Button L_Button = new Button();
L_Button.ID = "Button_2";
L_Button.Text = "输出";
L_Button.Attributes.Add("runat", "server");
L_Button.BackColor = System.Drawing.Color.Blue;
L_Button.ForeColor = System.Drawing.Color.Wheat;
//Response.Write("<SCRIPT> function DDD() {alert('XXXX');} </SCRIPT>");
//L_Button.Attributes.Add("OnClick", "DDD()");
L_Button.Click += new EventHandler(L_Button_Click);
return (L_Button);
}

protected void L_Button_Click(object sender, EventArgs e)
{
Response.Write("XXX");
}

wdf618 2008-12-08
  • 打赏
  • 举报
回复
经鉴定,一楼的无效!
期待更多有效的回答~~~
girlhappy 2008-12-08
  • 打赏
  • 举报
回复
你可以把这几句
L_Button.Attributes.Add("runat", "server");
L_Button.BackColor = System.Drawing.Color.Blue;
L_Button.ForeColor = System.Drawing.Color.Wheat;
L_Button.Click += new EventHandler(this.CCC);//这句话我试着写的,发觉无效
换成
L_Button.BackColor = System.Drawing.Color.Blue;
L_Button.ForeColor = System.Drawing.Color.Wheat;
L_Button.Click += new EventHandler(L_Button_Click );


protected void L_Button_Click (object sender, EventArgs e)
{
Response.Write("XXX");
}



62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧