遇到一个奇怪的问题,点俩次“创建”后,在点击第一个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.

请高人解答这俩个问题。
...全文
258 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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();
}
为什么要加?这个没意义啊
什么是SWFUpload?   SWFUpload是一个客户端文件上传工具,最初由Vinterwebb.se开发,它通过整合Flash与JavaScript技术为WEB开发者提供了一个具有丰富功能继而超越传统标签的文件上传模式。 [编辑本段]SWFUpload的主要特点   * 可以同时上传多个文件;   * 类似AJAX的无刷新上传;   * 可以显示上传进度;   * 良好的浏览器兼容性;   * 兼容其他JavaScript库 (例如:jQuery, Prototype等);   * 支持Flash 8和Flash 9;   SWFUpload不同于其他基于Flash构建的上传工具,它有着优雅的代码设计,开发者可以利用XHTML、CSS和JavaScript来随心所欲的定制它在浏览器下的外观;它还提供了一组简明的JavaScript事件,借助它们开发者可以方便的在文件上传过程中更新页面内容来营造各种动态效果。   在使用SWFUpload之前,请确认你具备一定的JavaScript和DOM知识。在实际开发中,大部分的错误都是由于错误的设置和低劣的Event Handlers处理程序所造成的。 [编辑本段]文档中文翻译   http://www.v-sky.com/doc/swfupload/v2.1.0/Documentation.html [编辑本段]效果演示   * Classic Form Demo http://demo.swfupload.org/formsdemo ;   * Features Demo http://demo.swfupload.org/featuresdemo ;   * Application Demo http://demo.swfupload.org/applicationdemo ;   * v1.0.2 Plugin Demo http://demo.swfupload.org/v102demo ; [编辑本段]选择合适的Flash控件   在发行包(SWFUpload v2)中含有2个版本的Flash控件(swfupload_f8.swf 与wfupload_f9.swf),其中一个版本拥有最佳的兼容性,但是为此损失了部分功能;而第二个版本提供了一些附加的功能但是损失了兼容性。 [编辑本段]SWFUpload的初始化与配置   首先,在页面中引用SWFUpload.js ,如      然后,初始化SWFUpload ,如   var swfu;   window.onload = function () {   swfu = new SWFUpload({   upload_url : "http://www.swfupload.org/upload.php",   flash_url : "http://www.swfupload.org/swfupload_f9.swf", file_size_limit : "20480"   });   };   以下是一个标准的SWFUpload初始化设置所需的参数,你可以根据需要自己进行删减:   {   upload_url : "http://www.swfupload.org/upload.php", 处理上传请求的服务器端脚本URL   file_post_name : "Filedata", 是POST过去的$_FILES的数组名   post_params : {   "post_param_name_1" : "post_param_value_1",   "post_param_name_2" : "post_param_value_2",   "post_param_name_n" : "post_param_value_n"   },   file_types : "*.jpg;*.gif", 允许上传的文件类型   file_types_description: "Web Image Files", 文件类型描述   file_size_limit : "1024", 上传文件体积上限,单位MB   file_upload_limit : 10, 限定用户一性最多上传多少个文件,在上传过程中,该数字会累加,如果设置为“0”,则表示没有限制   file_queue_limit : 2, 上传队列数量限制,该项通常不需设置,会根据file_upload_limit自动赋值   fl

62,243

社区成员

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

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

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

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