遇到一个奇怪的问题,点俩次“创建”后,在点击第一个button没有触发事件

zhmvb 2011-10-13 01:06:09
代码如下:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication6.WebForm1" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="创建" />
<br />
<asp:Label ID="Label1" runat="server" Text=""></asp:Label>
<br />
<asp:Panel ID="Panel1" runat="server">
</asp:Panel>
<div>
</div>
</form>
</body>
</html>





using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication6
{
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
this.CreateControls();
}

protected void Button1_Click(object sender, EventArgs e)
{
List<string> ls = new List<string>();
ls.Add("1");
ls.Add("2");
ls.Add("3");
this.ViewState["ls"] = ls;
this.CreateControls();
}

void CreateControls()
{
if (this.ViewState["ls"] != null)
{
var ls = (List<string>)this.ViewState["ls"];
this.Panel1.Controls.Clear();
foreach (var r in ls)
{
var b = new Button();
b.Text = r;
b.Click += new EventHandler(Button_Click);
this.Panel1.Controls.Add(b);
}
}
}

protected void Button_Click(object sender, EventArgs e)
{
this.Label1.Text = (sender as Button).Text + "_" + DateTime.Now.ToString();
}
}
}




第一个问题:
点击“创建”后创建了三个button,分别点击这三个button后都能触发click事件。
问题:连续点击俩次“创建”后,在点击被创建的button,第一次竟然无法触发click,再点一次竟然可以了。
想不明白这是为什么?

第二个问题:
在动态创建button时,如果指定了id,比如上面的代码写成这样:

foreach (var r in ls)
{
var b = new Button();
b.ID = "s" + Guid.NewGuid().ToString();
b.Text = r;
b.Click += new EventHandler(Button_Click);
this.Panel1.Controls.Add(b);
}


设置id属性后创建的button竟然无法触发click.

请高人解答这俩个问题。
...全文
384 13 打赏 收藏 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
ruanwei1987 2011-10-13
  • 打赏
  • 举报
回复
zhmvb 2011-10-13
  • 打赏
  • 举报
回复
搞定了,原来是id搞的鬼,在动态创建控件时,控件的Id最好是同一种、类型短小的字符。
例如

foreach (var r in ls)
{
var b = new Button();
b.ID = r;
b.Text = r;
b.Click += new EventHandler(Button_Click);
this.Panel1.Controls.Add(b);
}
majten 2011-10-13
  • 打赏
  • 举报
回复




up\
小笨熊 2011-10-13
  • 打赏
  • 举报
回复
不知道,学习下。。。
zhmvb 2011-10-13
  • 打赏
  • 举报
回复
点击俩次“创建”后,为什么点击第俩次按钮可以引发click事件呢?
孟子E章 2011-10-13
  • 打赏
  • 举报
回复
所以啊,有些东西需要改变思路来做啊,。
zhmvb 2011-10-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 net_lover 的回复:]

这是.net的机制问题。把b.Click += new EventHandler(Button_Click);放在Page_PreInit事件里才可以
[/Quote]

试了一下在OnPreInit里拿不到ViewState["ls"]的数据,这样就没法创建控件,也没法绑定事件了
孟子E章 2011-10-13
  • 打赏
  • 举报
回复
这是.net的机制问题。把b.Click += new EventHandler(Button_Click);放在Page_PreInit事件里才可以
zhmvb 2011-10-13
  • 打赏
  • 举报
回复



up/
ruanwei1987 2011-10-13
  • 打赏
  • 举报
回复
哦,发现了,确实很有意义,不加那句话,你这个页面就形成不了


这个尽量在JS 里面增加吧

如果你想测试委托链,用winform程序应该比较好测试点


我也想不清楚,如果一个button增加两次事件,那么点击一次它应该执行两次才对

这里,第一次没反应 ,第二次执行了(但是没测试是不是两次)

mark学习吧
shenzhenchina 2011-10-13
  • 打赏
  • 举报
回复
遇到同样的问题了。
zhmvb 2011-10-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ruanwei1987 的回复:]

protected void Page_Load(object sender, EventArgs e)
{
this.CreateControls();
}
为什么要加?这个没意义啊
[/Quote]
有意义,不然点击了动态创建的按钮后他们就消失了。
ruanwei1987 2011-10-13
  • 打赏
  • 举报
回复
protected void Page_Load(object sender, EventArgs e)
{
this.CreateControls();
}
为什么要加?这个没意义啊

62,271

社区成员

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

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

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

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